【问题标题】:Regular expression help needed in pythonpython中需要的正则表达式帮助
【发布时间】:2020-08-20 16:31:25
【问题描述】:

谁能帮我形成一个正则表达式来将模式dd-ddd 识别为句子中的一个完整单词,例如在这样的句子中 -

11-222 应该在句首匹配,33-444 在中间但不是55-66-777,因为整个单词不匹配模式。如果模式出现在末尾,那也应该匹配 88-999

如果我使用像'\b\d{2}-\d{3}\b' 这样的正则表达式,它甚至可以匹配66-777 中的55-66-777。我需要排除它。不知何故,-(连字符)被视为单词的边界。

知道如何实现这一目标吗?

添加示例代码和输出

import re
regex_str = r'\b\d{2}-\d{3}\b'
msg_message = '11-222 should be matched, as well as 33-444 but not 55-66-777. If it is present at the end, that should also be matched like 88-999'
for match in re.finditer(regex_str, msg_message):
    print('*'*15)
    print(match.group(0))
    print(match.span())

O/p

***************
11-222
(0, 6)
***************
33-444
(37, 43)
***************
66-777
(55, 61)
***************
88-999
(125, 131)

【问题讨论】:

  • 使用空间? (^|\s)\d{2}-\d{3}(\s|$)
  • 使用(?<!\S)\d{2}-\d{3}(?!\S)
  • 其实也可以出现在句首,所以前面的空格是不行的。字符串结尾也一样。

标签: python-3.x regex


【解决方案1】:

您可以使用(?<!\S)\d{2}-\d{3}(?!\S)。此模式确保在前后都有空格字符(或无字符 - 即字符串的开始/结束)。

See it in use here

它是如何工作的:

  • (?<!\S) 确保前面的内容不匹配非空白字符
  • \d{2} 匹配两位数
  • - 从字面上匹配这个字符
  • \d{3} 匹配三位数字
  • (?!\S) 确保后面的内容不匹配非空白字符

故意使用双重否定。另一种方法是分别使用(?<=\s|^)(?=\s|$)(但它更长,更不性感)。

【讨论】:

    【解决方案2】:

    您可以使用negative lookbehind 来匹配您的模式,但前面没有连字符

    (?<!\-)\d{2}\-\d{3}

    import re
    regex_str = r'\b(?<!\-)\d{2}\-\d{3}\b'
    msg_message = '11-222 should be matched, as well as 33-444 but not 55-66-777. If it is present at the end, that should also be matched like 88-999'
    for match in re.finditer(regex_str, msg_message):
        print('*'*15)
        print(match.group(0))
        print(match.span())
    
    ***************
    11-222
    (0, 6)
    ***************
    33-444
    (37, 43)
    ***************
    88-999
    (125, 131)
    

    如果您想对表达式的右侧应用相同的处理,您可以对否定的前瞻 (?!\-) 执行相同的操作。

    【讨论】:

    • 这似乎有效。非常感谢!我将尝试验证其他一些示例。再次感谢!
    • 这与11-111-1...格式的数字的第一部分不匹配
    • @Digi 同一个链接页面告诉您如何进行负前瞻。如果您还想在字符串的右侧强制执行相同的条件,也可以使用否定前瞻。
    • @ctwheels,这不是问题的一部分。无论如何,如果 OP 遇到这个问题,答案就在我链接的页面中。
    • @PranavHosangadi 同意。我们在正则表达式中看到了很多。不幸的是,正则表达式在大多数语言中是一个鲜为人知的实用程序,并引起了相当多的混乱。如果我们不给他们一个完整的答案,他们经常会回来问第二个问题,作为第一个问题的跟进。然后你最终会遇到双倍的问题:/无论哪种方式都是双输的情况哈哈。
    猜你喜欢
    • 2021-08-29
    • 2016-02-01
    • 2021-09-01
    • 2012-11-30
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多