问题:
有没有办法告诉正则表达式引擎将正则表达式的某个部分视为 verbatim (即在没有通常解析的情况下完全按原样查找该部分)而无需手动转义特殊字符?
某些背景信息:
我试图从另一个正则表达式反向引用一个给定正则表达式的组。例如,假设我想将hello(.*?)olleh
与文本1匹配,然后在文本2中查找bye$1eyb
,其中$1
将被文本1中匹配的第1组替换。因此,如果文本1恰好包含字符串"helloFOOolleh"
,程序将在文本2中查找"byeFOOeyb"
。
在大多数情况下,上述工作正常,但如果文字1包含"hello.olleh"
之类的内容,则该计划不仅会与"hello.olleh"
匹配,还会与"helloXolleh"
,"hellouolleh"
匹配在文本2中,等等,因为它将.
解释为正则表达式特殊字符而不是普通点字符。
其他评论:
我不能只搜索将$1
解析为任何组1匹配所产生的普通字符串,因为我想在文本2中搜索的内容本身可能包含其他不相关的正则表达式。
我一直在努力避免解析从文本1返回的匹配并转义每一个特殊字符,但是如果有人知道这样做的方法可以正常工作。
我目前正在使用Python进行此操作,但如果可以使用任何其他语言/程序轻松完成,我很乐意尝试。
答案 0 :(得分:2)
您可以使用re.escape
功能转义要匹配的文字。因此,在您提取匹配文本(例如“hello.olleh”中的“。”)之后,在将其插入第二个正则表达式之前应用re.escape
。
答案 1 :(得分:1)
为了说明BrenBarn所写的内容,
import re
text1 = "hello.olleh"
text2_match = "bye.eyb"
text2_nomatch = "byeXeyb"
found = re.fullmatch(r"hello(.*?)olleh", text1).group(1)
然后,您可以使用re.escape
:
new_search = "bye{}eyb".format(re.escape(found))
试验:
re.search(new_search, text2_match)
#>>> <_sre.SRE_Match object; span=(0, 7), match='bye.eyb'>
re.search(new_search, text2_nomatch)
#>>> None