【问题标题】:Verbatim-like context in a regular expression正则表达式中的逐字上下文
【发布时间】:2014-09-24 19:40:34
【问题描述】:

问题:

有没有办法告诉正则表达式引擎将正则表达式的某个部分视为逐字(即完全按原样查找该部分,无需通常的解析)而无需手动转义特殊字符?

一些上下文:

我正在尝试从另一个正则表达式反向引用给定正则表达式上的组。例如,假设我想将 hello(.*?)olleh 与文本 1 匹配,然后在文本 2 中查找 bye$1eyb,其中 $1 将被文本 1 中匹配的组 1 替换。因此,如果文本 1 恰好包含字符串"helloFOOolleh",程序会在文本2中寻找"byeFOOeyb"

以上方法在大多数情况下都可以正常工作,但如果文本 1 包含类似 "hello.olleh" 的内容,则程序将不仅匹配 "hello.olleh",还匹配文本 2 中的 "helloXolleh""hellouolleh" 等,如它将. 解释为正则表达式特殊字符,而不是普通的点字符。

其他 cmets:

我不能只搜索将 $1 解析为任何组 1 匹配的纯字符串,因为我想在文本 2 中搜索的任何内容本身都可能包含其他不相关的正则表达式。

我一直在尝试避免解析从文本 1 返回的匹配项并转义每个特殊字符,但如果有人知道一种方法可以巧妙地做到这一点,那也可以。

我目前正在使用 Python 进行这项工作,但如果可以使用任何其他语言/程序轻松完成,我很乐意尝试一下。

【问题讨论】:

  • 如果您对其他语言持开放态度,您可能想尝试支持内引用的 Perl 或 PHP/PCRE \Q..\E

标签: python regex escaping


【解决方案1】:

您可以使用re.escape 函数来转义要按字面意思匹配的文本。因此,在您提取匹配文本(例如,“hello.olleh”中的“.”)后,在将其插入第二个正则表达式之前对其应用 re.escape

【讨论】:

    【解决方案2】:

    为了说明 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
    

    【讨论】:

      猜你喜欢
      • 2018-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-19
      • 2020-07-01
      • 2014-09-01
      • 2015-02-05
      • 1970-01-01
      相关资源
      最近更新 更多