【问题标题】:getting string mix using regex使用正则表达式获取字符串混合
【发布时间】:2019-09-20 17:14:13
【问题描述】:
import re
s = 'words here plus num A18-11186 B7  and Q12-45786 D3'

我有以下字符串,我想使用正则表达式提取A18-11186 B7Q12-45786 D3。我已经尝试了以下

reg = r'\b(?=\d*[A-Z])((?:[A-Z0-9]+-)(?:\d+-)?\d+)\b'
r1 = re.findall(reg,s)

这给了我

['A18-11186', 'Q12-45786']

这与我想要的很接近,只是它缺少空格、字母和数字。

如何更改我的reg 以获得所需的输出?

想要的输出

['A18-11186 B7', 'Q12-45786 D3']

【问题讨论】:

    标签: python regex python-3.x string text


    【解决方案1】:

    在匹配第一个大写字符和最后一个数字之前,您可以在不使用正向前瞻和使用单词边界 \b 的情况下获得匹配项。

    \b[A-Z][0-9]+-[0-9]+ [A-Z][0-9]+\b
    

    部分

    • \b字边界
    • [A-Z][0-9]+ 匹配单个 A-Z 和 1 个以上数字
    • -[0-9]+ 匹配 -,1+ 个数字和一个空格
    • [A-Z][0-9]+ 匹配单个 A-Z 和 1+ 个数字
    • \b字边界

    Regex demo | Python demo

    例如

    import re
    regex = r"\b[A-Z][0-9]+-[0-9]+ [A-Z][0-9]+\b"
    test_str = "words here plus num A18-11186 B7  and Q12-45786 D3"
    print(re.findall(regex, test_str))
    

    输出

    ['A18-11186 B7', 'Q12-45786 D3']
    

    【讨论】:

      【解决方案2】:

      如果您不确定预期的格式,那么您可以使用:

      [A-Z0-9-]+[A-Z0-9 -]*?[A-Z0-9-]+
      

      https://regex101.com/r/LMvz15/1

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-07
        • 1970-01-01
        • 1970-01-01
        • 2019-05-02
        • 2018-03-15
        • 2017-04-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多