【问题标题】:regex to extract first series of numbers in a string and all words after正则表达式提取字符串中的第一个数字系列和之后的所有单词
【发布时间】:2014-06-12 23:39:40
【问题描述】:

尝试编写一个将在 python 2.7 中执行以下操作的正则表达式:

FOO 288-B BAR <MATCH: "288-B BAR">

BURT 69/ERNIE 96/KERMIT 287 <MATCH: "69">

53 ORANGE <MATCH: "53 ORANGE">

APPLE 457-W <MATCH: "457-W">

除了“空格”和“-”和“/”没有其他标点符号。我只想匹配任何数字和任何字母/单词的第一次出现,其前面带有“-”或“空格”。

我试过了:

【问题讨论】:

  • 你能显示一些预期的输出吗?
  • 仅供参考我有一个错误:它可能以空格结尾。现在修好了,看看。 :)
  • 为什么这个BURT 69/ERNIE 96/KERMIT 287 应该只匹配69 而不是69/ERNIE 96/KERMIT 287??
  • @AamirAdnan '/' 是我唯一需要区别对待的标点符号,而不是 '-' 和 ' '。所以,基本上,如果我看到一个'/',我需要得到'/'之前的数字——并且只有那个数字('/'之后什么都没有)

标签: python regex python-2.7 regex-negation


【解决方案1】:

如果我了解您的要求,您可以使用它,然后从第 1 组中检索匹配项:

(?im)^\D*(\d+(?:[- ][a-z ]*[a-z])?)

这是demo(请查看右下方窗格中的捕获组)。

要检索匹配项:

for match in re.finditer(r"(?im)^\D*(\d+(?:[- ][a-z ]*[a-z])?)", subject):
    yournumber = match.group(1)

它是如何工作的?

  1. (?im) 多行、不区分大小写模式中的 ^ 将我们固定在行首。
  2. \D* 会跳过任何非数字
  3. (\d+(?:[- ][a-z ]*[a-z])?) 匹配并捕获到第 1 组,数字后跟短划线或空格以及更多空格和字母,以字母结尾。

【讨论】:

  • @zx81 您的表达式将仅匹配来自APPLE 457-W3457-W 而不是457-W3[a-z ]*[a-z] 更改为[a-z0-9 ]*[a-z0-9] 才能工作。
  • @AamirAdnan 很高兴收到您的来信。要求尚不清楚:any letter/word following... 我假设他想以字母结尾,但如果他想按照您的建议允许 457-W1111 之类的字符串,是的,这是一个简单的调整。 :) 他在测试中使用了\w 字字符这一事实在这个阶段没有任何症状,因为他没有提到下划线。
  • @我希望它以一封信结尾。更多数字无法通过仅包含的测试。第一个数字系列。 (对不起,清晰度失败)。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-05
相关资源
最近更新 更多