【发布时间】: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。