【问题标题】:how to split very long regular expression in python如何在python中拆分很长的正则表达式
【发布时间】:2014-05-28 12:34:37
【问题描述】:

我有一个很长的正则表达式。

 vpa_pattern = '(VAP) ([0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}): (.*)'

我的匹配组代码如下:

 class ReExpr:
def __init__(self):
    self.string=None

def search(self,regexp,string):
    self.string=string
    self.rematch = re.search(regexp, self.string)
    return bool(self.rematch)

def group(self,i):
    return self.rematch.group(i)

 m = ReExpr()

 if m.search(vpa_pattern,line):
    print m.group(1)
    print m.group(2)
    print m.group(3)

我尝试通过以下方式将正则表达式模式变为多行,

vpa_pattern = '(VAP) \
    ([0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}):\
    (.*)'

或者我也试过了:

 vpa_pattern = re.compile(('(VAP) \
    ([0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}):\
    (.*)'))

但上述方法不起作用。对于每个组,我在左括号和右括号后都有一个空格 ()。我猜当我拆分为多行时它没有收到。

【问题讨论】:

  • (VAP) ((?:[0-9A-Fa-f]{2}:){5}) (.*)这样更简单的正则表达式呢?

标签: python regex


【解决方案1】:

看看re.X flag。它允许 cmets 并忽略正则表达式中的空格。

a = re.compile(r"""\d +  # the integral part
               \.    # the decimal point
               \d *  # some fractional digits""", re.X)

【讨论】:

  • +1 还应该注意的是,Python 的 r"""raw multi-line string""" 语法(在此处使用)使得编写这些自记录正则表达式变得更加容易(因为它完全避免了任何反斜杠汤混淆)。
【解决方案2】:

如果用括号括起来,Python 允许在部分中写入文本字符串:

>>> text = ("alfa" "beta"
... "gama")
...
>>> text
'alfabetagama'

或在您的代码中:

text = ("alfa" "beta"
        "gama" "delta"
        "omega")
print text

将打印

"alfabetagamadeltaomega"

【讨论】:

    【解决方案3】:

    其实很简单。您已经使用了{} 表示法。再次使用它。所以而不是:

    '([0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}):'
    

    这只是重复[0-9A-Fa-f]{2}: 6 次,你可以使用:

    '([0-9A-Fa-f]{2}:){6}'
    

    我们甚至可以通过使用\d 来表示数字来进一步简化它:

    '([\dA-Fa-f]{2}:){6}'
    

    注意:取决于您使用的 re 函数,you can pass in re.IGNORE_CASE 并将该块简化为 [\da-f]{2}:

    所以你的最终正则表达式是:

    '(VAP) ([\dA-Fa-f]{2}:){6} (.*)'
    

    【讨论】:

    • 重复组只捕获最后一次重复。相反,在捕获组内使用重复的非捕获组。另请注意,OP 的正则表达式不会捕获最后一个冒号。
    • 如果 OPs 正则表达式没有捕获最终的 : 那么这里的 : 是什么:'...[0-9A-Fa-f]{2}): (.*)' 在做什么?
    • () 定义了一个 OP 访问的组为m.group(2)。最后一个: 在括号外。
    • 我明白了。他们都会识别相同的字符串,尽管组结构似乎不同。
    猜你喜欢
    • 2021-10-07
    • 2011-12-21
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 2020-12-31
    • 2012-09-24
    • 2022-11-24
    • 2018-02-05
    相关资源
    最近更新 更多