【问题标题】:Add boundaries around a regex without changing the regex在正则表达式周围添加边界而不更改正则表达式
【发布时间】:2018-01-29 22:36:19
【问题描述】:

我正在尝试从文件中提取哈希值,并希望在不直接更改正则表达式的情况下在正则表达式周围添加边界子句 (\b)。

例如,让我们使用这个正则表达式:^\$1\$\w+\$\w+(.)?\w+..$,我已经编译好了:re.compile(r"^\$1\$\w+\$\w+(.)?\w+..$")。现在我想保持正则表达式不变并在它周围添加边界而不直接更改正则表达式本身。所以像:

def add_bound(regex_string):
    return r"\b{}\b".format(regex_string)

我遇到的唯一问题是我的正则表达式是在执行之前预编译的,所以它会将它们变成类似<_sre.SRE_Pattern object at 0x7f846a189770> 的东西。有没有办法在已编译的正则表达式周围添加边界?

【问题讨论】:

  • 为什么你需要用字边界包裹^\$1\$\w+\$\w+(.)?\w+..$?那样就行不通了,因为\b^\$ 需要在$ 之前添加一个字符字符。当我们确定输入是字面词时,我们只想设置单词边界,在开头和结尾都有单词字符。
  • 如果你将它们编译成一个变量,你可以使用variablename.pattern 来获取模式。如果那真的是你想要做的。例如。 regex = re.compile("[A-Z]") regex.pattern '[A-Z]'

标签: python regex python-2.7 boundary


【解决方案1】:

是的,你可以做的是反编译它,添加边界,然后重新编译它。

import regex as re

def add_bound(regex_obj):
    new_regex_string = r'\b' + regex_obj.pattern + r'\b'
    new_regex_obj = re.compile(new_regex_string)
    return new_regex_obj


# example usage
some_text = """
ahello worlda
hello world
"""
regex_obj = re.compile(r"hello world")

print re.findall(add_bound(regex_obj),some_text)

上面的函数用于解释/说明,代码中应该使用的函数是:

import regex as re
def add_bound(regex_obj):
    return re.compile(r'\b' + regex_obj.pattern + r'\b')

我使用How to decompile a regex? 来开发这个答案

我不确定为什么您的示例正则表达式 (^\$1\$\w+\$\w+(.)?\w+..$) 以锚点 (^ 和 $) 开头和结尾,因为它们基本上会覆盖添加边界 (\b)。

【讨论】:

    猜你喜欢
    • 2011-03-28
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    相关资源
    最近更新 更多