【问题标题】:Python regex matching return all matchesPython 正则表达式匹配返回所有匹配项
【发布时间】:2021-10-12 23:29:08
【问题描述】:

我有由字母和数字组成的字符串,例如:

Ex1:“电话 18020210 914 171 717 邮箱 43, 1003 Florvaag”

Ex2:“电话 18020210 N 0914 171 717 邮箱 43, 1003 Florvaag”

Ex3:“电话 18020210 N0914 171 717 邮箱 43, 1003 Florvaag”

我想找到像“914 171 717”和“0210 914 171”这样的数字,例如。九位数字前面可以是零,也可以是空格。

我试过了:

re.findall('[\s|0]\d{3}\s\d{3}\s\d{3}\s',Ex1)

但是这个表达式只返回 ['0210 914 171'],而我希望它返回两个数字:['0210 914 171','914 171 717']

这可能是一个快速修复,但我不知道该怎么做。

【问题讨论】:

  • [\s|0]?\d{3}\s\d{3}\s\d{3}\s? 你也可以使用[\s\d]+ 更短更易读。
  • 方括号表示一个字符类,而不是一个组。
  • 尝试re.findall('[\s|0]?\d{3}\s\d{3}\s\d{3}\s?',Ex1)时,我仍然只得到:['0210 914 171']

标签: python regex findall


【解决方案1】:

你可以使用

re.findall(r'\b0?\d{3}\s\d{3}\s\d{3}\b', text)

请参阅regex demo。

详情:

  • \b - 单词边界
  • 0? - 一个可选的0
  • \d{3} - 三位数
  • \s - 一个空格
  • \d{3} - 三位数
  • \s\d{3} - 空格,三位数字
  • \b - 单词边界。

见Python demo:

import re
s = 'Phone 18020210 914 171 717 mailbox 43, 1003 Florvaag\nEx2: "Phone 18020210 N 0914 171 717 mailbox 43, 1003 Florvaag\nPhone 18020210 N0914 171 717 mailbox 43, 1003 Florvaag'
print( re.findall(r'\b0?\d{3}\s\d{3}\s\d{3}\b', s) )
# -> ['914 171 717', '0914 171 717']

【讨论】:

    猜你喜欢
    • 2020-12-02
    • 1970-01-01
    • 2018-02-18
    • 2012-12-22
    • 1970-01-01
    • 2022-01-14
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多