【问题标题】:Regex - How to match single character while excluding two in a row?正则表达式 - 如何在连续排除两个字符的同时匹配单个字符?
【发布时间】:2018-12-22 09:14:09
【问题描述】:

我正在尝试使用正则表达式匹配以下示例中的属性名称(“SUP NR”、“QUANTITY”、“MOD/REF”):

SUP NR:K16518-1,数量:2 件// MOD/REF:16-1P1-0612

注意:

  • 属性名称后始终跟一个“:”字符
  • 属性可以由多个单词组成,可以由空格 ("SUP NR") 或 / ("MOD/REF") 分隔
  • 开头有一个空格字符(在“SUP NR”之前)

我尝试使用以下正则表达式这样做:

(?<=\s)[a-zA-Z\s/]+:

我使用的 (?

如果不是双 '//' 字符,它会起作用,这当然匹配字符集中的 '/' 字符。有没有办法在字符集中只包含单个 '/' 字符而排除双 '//' 字符? (也许还有更优雅的方法?)

编辑: 请注意,属性也可能包含两个以上的单词。此外,选择的属性名称只是示例,它也应该适用于不同的名称。

【问题讨论】:

    标签: regex


    【解决方案1】:

    你可以使用这个正则表达式:

    \s([a-zA-Z]+(?:[/\s][a-zA-Z]+)*):
    

    它查找前面有空格的单词,后面跟着可选的分隔符组(空格或/)和另一个单词,后面跟着:。对于您的数据组 1 是 SUP NRQUANTITYMOD/REF

    Demo on regex101

    使用 python,您可以像这样使用这个正则表达式:

    import re
    string = " SUP NR: K16518-1, QUANTITY: 2 PIECES// MOD/REF: 16-1P1-0612"
    regex = re.compile('\s([a-zA-Z]+(?:[/\s][a-zA-Z]+)*):')
    print regex.findall(string)
    

    输出:

    ['SUP NR', 'QUANTITY', 'MOD/REF']
    

    Demo on rextester

    【讨论】:

    • 这确实适用于 regex101,但是当我在 sublime 或 python (re package) 中尝试它时,它不起作用.. 可能是什么原因?
    • @nkaenzig 我添加了显示正则表达式工作正常的 python 代码。
    • 感谢您的回答。你是对的,它适用于帖子中的示例。但是当我在更大的数据集上运行它时,它会冻结(发生在 sublime 和 python 中)
    • @nkaenzig 你能弄清楚它冻结了哪些数据吗?
    • @nkaenzig 我已经更新了正则表达式以避免可能导致冻结问题的灾难性回溯。
    【解决方案2】:

    你不需要看背后。你也可以更具体。

    试试这个:

    [a-zA-Z]+([ /][a-zA-Z]+)*(?=:)
    

    live demo


    顺便说一句,你的后视不是消极,而是积极 - 消极的后视使用语法(?&lt;!...)

    【讨论】:

    • 这仅适用于仅包含两个单词的属性名称。它也应该适用于包含更多单词的属性。
    • @nkaenzig 已修复(基本上将 ? 更改为 *
    猜你喜欢
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多