首页 > 解决方案 > python中需要的正则表达式帮助

问题描述

任何人都可以帮助我形成一个正则表达式来将模式识别dd-ddd为一个句子中的一个完整单词,例如在这样的句子中 -

11-222应该在句子的开头匹配,33-444在中间也应该匹配,但不是55-66-777因为整个单词与模式不匹配。如果模式出现在最后,那也应该像这样匹配88-999

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

标签: python-3.xregex

解决方案


您可以使用(?<!\S)\d{2}-\d{3}(?!\S). 这种模式确保前后都有一个空白字符(或没有字符 - 即字符串的开始/结束)。

在此处查看它的使用情况

这个怎么运作:

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

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


推荐阅读