如何在正则表达式中使用变量
- 2024-12-12 08:40:00
- admin 原创
- 118
问题描述:
我想在正则表达式中使用变量,如何在 Python 中做到这一点?
TEXTO = sys.argv[1]
if re.search(r"(?=w)TEXTO(?!w)", subject, re.IGNORECASE):
# Successful match
else:
# Match attempt failed
解决方案 1:
您必须将正则表达式构建为字符串:
TEXTO = sys.argv[1]
my_regex = r"(?=w)" + re.escape(TEXTO) + r"(?!w)"
if re.search(my_regex, subject, re.IGNORECASE):
etc.
请注意使用re.escape
,如果您的文本包含特殊字符,它们就不会被解释为特殊字符。
解决方案 2:
从 Python 3.6 开始,您还可以使用文字字符串插值,即“f-strings”。在您的特定情况下,解决方案将是:
if re.search(rf"(?=w){TEXTO}(?!w)", subject, re.IGNORECASE):
...do something
编辑:
由于评论中存在一些关于如何处理特殊字符的问题,所以我想扩展我的答案:
原始字符串('r'):
处理正则表达式中的特殊字符时,必须了解的主要概念之一是区分字符串文字和正则表达式本身。这里解释得很清楚:
简而言之:
假设
TEXTO
您想要匹配字符串,而不是查找单词边界oundary
。那么您必须这样写:
TEXTO = "Var"
subject = r"Varoundary"
if re.search(rf"(?=w){TEXTO}\\boundary(?!w)", subject, re.IGNORECASE):
print("match")
这只有在我们使用原始字符串(正则表达式前面有“r”)时才有效,否则我们必须在正则表达式中写入“\\\\boundary”(四个反斜杠)。此外,如果没有“\r”,\b' 将不再转换为单词边界,而是转换为退格符!
重新.逃脱:
基本上在任何特殊字符前面都加一个反斜杠。因此,如果您希望在 TEXTO 中出现特殊字符,则需要这样写:
if re.search(rf"(?=w){re.escape(TEXTO)}(?!w)", subject, re.IGNORECASE):
print("match")
注意:对于任何版本 >= Python 3.7:,,,,,,,,,,,,,和均不!
进行转义。只有在正则表达式中有意义的特殊字符才会被转义。自 Python 3.3起"
,不再进行转义。(此处为)%
`',
/:
;<
=>
@`
_`
花括号:
如果要在使用 f 字符串的正则表达式中使用量词,则必须使用双花括号。假设您要匹配 TEXTO 后跟 2 位数字:
if re.search(rf"(?=w){re.escape(TEXTO)}d{{2}}(?!w)", subject, re.IGNORECASE):
print("match")
解决方案 3:
if re.search(r"(?<=w)%s(?!w)" % TEXTO, subject, re.IGNORECASE):
这会将 TEXTO 中的内容作为字符串插入到正则表达式中。
解决方案 4:
rx = r'(?<=w){0}(?!w)'.format(TEXTO)
解决方案 5:
我发现通过将多个较小的模式串在一起来构建正则表达式模式非常方便。
import re
string = "begin:id1:tag:middl:id2:tag:id3:end"
re_str1 = r'(?<=(S{5})):'
re_str2 = r'(idd+):(?=tag:)'
re_pattern = re.compile(re_str1 + re_str2)
match = re_pattern.findall(string)
print(match)
输出:
[('begin', 'id1'), ('middl', 'id2')]
解决方案 6:
我同意以上所有内容,除非:
sys.argv[1]
就像Chickend{2}-d{2}Ans*importants*anchor
sys.argv[1] = "Chickend{2}-d{2}Ans*importants*anchor"
你不会想使用re.escape
,因为在这种情况下你希望它表现得像一个正则表达式
TEXTO = sys.argv[1]
if re.search(r"(?<=w)" + TEXTO + "(?!w)", subject, re.IGNORECASE):
# Successful match
else:
# Match attempt failed
解决方案 7:
您可以尝试使用format
语法糖的另一种用法:
re_genre = r'{}'.format(your_variable)
regex_pattern = re.compile(re_genre)
解决方案 8:
我需要搜索彼此相似的用户名,Ned Batchelder 所说的非常有帮助。但是,我发现当我使用 re.compile 创建搜索词时,输出结果更清晰:
pattern = re.compile(r"("+username+".*):(.*?):(.*?):(.*?):(.*)"
matches = re.findall(pattern, lines)
可以使用以下命令打印输出:
print(matches[1]) # prints one whole matching line (in this case, the first line)
print(matches[1][3]) # prints the fourth character group (established with the parentheses in the regex statement) of the first line.
解决方案 9:
这是您可以使用的另一种格式(在 Python 3.7 上测试)
regex_str = r'(?<=w)%s(?!w)'%TEXTO
我发现当你不能使用{}
变量时它很有用(这里替换为%s
)
解决方案 10:
您也可以为此使用格式关键字。格式方法将用您作为参数传递给格式方法的变量替换 {} 占位符。
if re.search(r"(?=w)**{}**(?!w)".**format(TEXTO)**, subject, re.IGNORECASE):
# Successful match**strong text**
else:
# Match attempt failed
解决方案 11:
更多示例
我有带有流文件的 configus.yml
"pattern":
- _(d{14})_
"datetime_string":
- "%m%d%Y%H%M%f"
在python代码中我使用
data_time_real_file=re.findall(r""+flows[flow]["pattern"][0]+"", latest_file)
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)