【问题标题】:python regex how to add patterns together with the pipe operand |python regex 如何将模式与管道操作数一起添加|
【发布时间】:2021-03-18 10:18:26
【问题描述】:

我正在处理python中的字符串,必须解决以下问题。

如何去掉字符串的第一部分直到特定子字符串的第一次出现。

示例:给我包含 xx 的第一次出现和之后的文本。或 XX。

text = 'this is another text XX. appel YY. banana xx. orange'
result = re.search(r"(?:xx\.|XX\.)(.*)",text).group(1) 
result

到目前为止一切顺利。

现在需要治疗更多病例。 像YYY。年年。等等

出于组织目的,我希望能够按以下方式对其进行编码: (伪代码,不起作用)

pattern1 = r'xx\.|XX\.'
pattern2 = r'yy\.|YY\.'
pattern3 = r'whatever1\.|whatever2\.|whatever3'
total_pattern = r'(?:' + '|' + pattern1 + '|' + pattern2 + '|' + pattern3 ..

想象在每种模式中都会有一组选项 我想避免有一个大的多行代码对于任何其他审查代码的同事来说都是不可读的。每个模式都与不同的问题相关。

total_pattern 结果: '(?:|xx\.|XX\.|yy\.|YY\.|whatever1\.|whatever2\.|whatever3'

是否在模式变量前面使用 r' 无关紧要。

最终我想做的是:

total_pattern = total_pattern + '(.*)'
result = re.search(total_pattern,text).group(1) 
result

双\弄乱了模式,结果不符合预期,因为没有匹配项。

预期输出:

XX. appel YY. banana xx. orange

编辑:问题不是关于获得最好的正则表达式(更压缩或其他什么,它只是关于在 re.search 正则表达式方法之外添加模式

EDIT2:此解决方案不起作用: Pythonic way to concatenate regex objects 由于在模式中使用了 \

【问题讨论】:

  • 使用原始字符串 r"like this"` 解决反斜杠问题。如果您使用不区分大小写的匹配(标志re.I),您可能不需要使用这么多|s。

标签: python regex string


【解决方案1】:

这个怎么样?

import re

patterns = [
    "XX.", "xx.",  # the xx
    "YY.", "yy.",  # the yy
    "whatever1.", "whatever2.", "whatever3",  # the whatevers
]
total_pattern = re.compile("((?:" + "|".join(map(re.escape, patterns)) + ").*)")


the_text = "this is another text XX. appel YY. banana xx. orange"
print(total_pattern.search(the_text).group(1))

打印:

XX. appel YY. banana xx. orange

它使用re.escape,因此您无需使用反斜杠手动转义模式中的任何正则表达式特殊字符。 此外,由于您希望捕获组包含您的模式,因此我更改了括号,因此非捕获组位于捕获组内。 不过,这就是整个匹配,因此您也可以摆脱捕获组并使用组 0,它始终是整个匹配部分。

import re

patterns = [
    "XX.", "xx.",  # the xx
    "YY.", "yy.",  # the yy
    "whatever1.", "whatever2.", "whatever3",  # the whatevers
]
total_pattern = re.compile("(?:" + "|".join(map(re.escape, patterns)) + ").*")


the_text = "this is another text XX. appel YY. banana xx. orange"
print(total_pattern.search(the_text).group(0))

同样的结果。

但是,它没有理由不应该像这样工作:

import re

patterns = [
    r"XX\.|xx\.",  # the xx'es
    r"YY\.|yy\.",  # the yy'es
    r"whatever1\.|whatever2\.|whatever3",  # the whatevers
]
total_pattern = re.compile("(?:" + "|".join(patterns) + ").*")


the_text = "this is another text XX. appel YY. banana xx. orange"
print(total_pattern.search(the_text).group(0))

所以我想知道,也许你创建total_pattern 的方式不起作用?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-06
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多