正则表达式之间的匹配数字?

时间:2019-01-18 01:42:19

标签: python regex

我想在这些字符串之间输入数字。

strings = ["point_right: account ISLAMIC: 860328 9221 asdsad",
       "account 723123123",
       "account823123213",
       "account 823.123.213",
       "account 823-123-213",
       "account:123213123 ",
       "account: 123213123 asdasdsad 017-299906",
       "account: 123213123",
       "point_right: account ISLAMIC: 860328 9221"
      ]

结果应为

[860328 9221,723123123, 823123213, 823.123.213, 823-123-213, 123213123, 123213123, 123213123]

然后我可以进行处理,以使它们成为数字。到目前为止,我的策略是将所有内容放在模式之后,将所有内容放在字母之前。我尝试过:

for string in strings:
    print(re.findall("(?<=account)(.*)", string.lower()))

请帮助提供一些有关正则表达式匹配的指针。

3 个答案:

答案 0 :(得分:1)

尝试以下模式:

(?=[^0-9]*)[0-9][0-9 .-]*[0-9]

故障:

  • (?=[^0-9]*)预搜索不匹配的单词,例如“帐户”
  • [0-9]查找数字
  • [0-9 .-]*查找任意数量的数字或特殊字符(在您的字符串中,您可以使用空格,破折号,句号,因此我将其包括在内)
  • [0-9]查找另一个数字(以防止在末尾出现空格)

检出here和示例代码here

答案 1 :(得分:0)

(?!\W)([\d\s.-]+)(?<!\s)

负面的前瞻性和后视性似乎在这里是过大的杀伤力,但否则我无法获得明确的匹配。您可能会看到结果here

(?!\W)负向查找以排除所有非单词字符[^a-zA-Z0-9_]

([\d\s.-]+)您的电话号码的捕获组

(?<!\s)负向后查找以排除空格字符[\r\n\t\f\v ]

答案 2 :(得分:0)

如果数字必须是account子字符串之后的第一个数字,则使用

re.findall("account\D*([\d\s.-]*\d)", s)

请参见Python demoregex demo

模式详细信息

  • account-文字子字符串
  • \D*-除数字以外的0多个字符
  • ([\d\s.-]*\d)-捕获组1(由re.findall返回的值):0个或多个数字,空格,.-字符,后跟一个数字。
  • li>