【问题标题】:Python regex matching only if digitPython 正则表达式仅在数字时匹配
【发布时间】:2013-02-28 19:40:00
【问题描述】:

鉴于正则表达式和下面的单词,我想匹配 - 之后的部分(也可以是 _ 或空格),前提是分隔符后面的部分是数字并且后面没有任何内容(我基本上想要只是一个数字和数字)。我正在使用组语句,但它似乎无法正常工作。它一直与开头的 3 匹配(如果我稍微修改一下,则匹配结尾的 1)。我如何实现这一点(通过使用分组)?

目标词:BR0227-3G1

正则表达式:([A-Z]*\s?[0-9]*)[\s_-]*([1-9][1-9]*)

不应该匹配 3G1, G1 , 1G

它应该只匹配纯数字,如 3,10, 2 等。

这里还有一个用于评估正则表达式的帮助网站:http://www.pythonregex.com/

更多示例:

应该匹配:

BR0227-3
BR0227 3
BR0227_3

分组(BR0227) (3)

它应该只匹配(BR0227)

BR0227-3G1
BR0227-CS
BR0227
BR0227-

【问题讨论】:

  • 我很困惑..您能否提供更多示例输入和输出(例如应该匹配/捕获和不匹配的示例)?
  • 请看编辑@ExplosionPills
  • @Cemre 检查我的答案,如果您正在寻找,请告诉我。
  • @OscarMederos 我使用我提供的网站尝试使用 BR0227-3G1 的正则表达式,它匹配 (u'G', u'1')
  • @Cemre 抱歉,正则表达式错误。现在更新我的答案。

标签: python regex


【解决方案1】:

我会用

re.findall('^([A-Z]*\s?[0-9]*)[\s_-]*([1-9][1-9]*$)?', str)

每个字符串都从第一组开始,到最后一组结束,因此^$ 组可以协助捕获。末尾的$ 要求捕获所有个数字,但它是可选的,因此仍然可以捕获第一组。

【讨论】:

  • 这个似乎很好用。我猜? 是我错过的关键部分
  • @Cemre 顺便说一句,如果所有单词都在一个字符串中,您可能需要使用re.MULTILINE.findall。如果你在迭代,你可以使用.match我认为
【解决方案2】:

既然你想要成组的单词的开始和(可能的)结束,那么这样做:

r'\b([A-Z0-9]+)(?:[ _-](\d+))?\b'

这会将单词的第一部分放在第一组中,并且可以选择将其余部分放在第二组中。如果不匹配,第二组将是 None

【讨论】:

  • 如果不匹配后面的字符
  • 这是最好的答案,因为您在可选匹配中包含分隔符。您应该删除所有其他内容并保留更新。另外,请记住,它可以是-_ 或空格(分隔符)。
【解决方案3】:

这应该匹配后面跟着“-”、“”或“_”的任何内容,后面只有数字。

(.*)[- _](\d+)

【讨论】:

  • 如果字符串是 BR0227-CS 则不匹配(它应该仍然匹配 BR0227)
  • 啊,我明白了。错过了这个要求
猜你喜欢
  • 1970-01-01
  • 2011-04-06
  • 1970-01-01
  • 2016-11-04
  • 2017-12-27
  • 1970-01-01
  • 2011-08-29
  • 2020-05-25
相关资源
最近更新 更多