正则表达式中类似逐字的上下文

时间:2014-09-24 19:40:35

标签: python regex escaping

问题:

有没有办法告诉正则表达式引擎将正则表达式的某个部分视为 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进行此操作,但如果可以使用任何其他语言/程序轻松完成,我很乐意尝试。

2 个答案:

答案 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