如何匹配后面没有空格的数字字符

时间:2018-11-05 23:08:37

标签: python regex

我需要匹配文本文档中的行,其中行以数字开头,而数字后没有任何内容。...我想包括以'.'','隔开的数字。 / p>

当前,我有:

p = re.compile('\$?\s?[0-9]+') 

for i, line in enumerate(letter):
   m = p.match(line)
   if s !=None:
      print(m)
      print(line)

哪个给我这个:

“ 15,704”和“ 416”->很好,我想要这个

但这也是

“ 4000万美元...”->我不想匹配这行或任何数字后跟单词的行。

我尝试过:

p = re.compile('\$?\s?[0-9]+[ \t\n\r\f\v]')

但是它不起作用。原因之一是,事实证明我要匹配的数字后面没有空格。

欣赏所有提示或技巧。

3 个答案:

答案 0 :(得分:0)

您可以使用以下正则表达式:

import re

pattern = re.compile('^[0-9,.]+\s*$')

lines = ["416", "15,704", "$40 million...."]

for line in lines:
    if pattern.match(line):
        print(line)

输出

416
15,704

模式^[0-9,.]+\s*$匹配所有,.的数字,后跟零个或多个空格。如果只想匹配一个,.的数字,请使用以下模式:'^\d+[,.]?\d+\s*$',代码:

import re

pattern = re.compile('^\d+[,.]?\d+\s*$')

lines = ["416", "15,704", "$40 million...."]

for line in lines:
    if pattern.match(line):
        print(line)

输出

416
15,704

模式^\d+[,.]?\d+\s*$匹配以一组数字(\d+开头,后跟可选的,.[,.]?)开头的所有内容一组数字,并带有一组可选的空格\s*

答案 1 :(得分:0)

对代码进行一些修改:

letter = ["15,704", "$40 million"]
p = re.compile('^\d{1,3}([\.,]\d{3})*$') # Numbers separated by commas or points

for i, line in enumerate(letter):
    m = p.match(line)
    if m:
        print(line)

输出:

15,704

答案 2 :(得分:0)

如果您要整个字符串与正则表达式匹配, 您有2个选择:

  • 可以调用re.fullmatch(pattern, string)(在函数名称中注意 full )。 它尝试仅匹配整个字符串。
  • 或者将$放在正则表达式的末尾,然后调用re.match(pattern, string)。 它会尝试从字符串的开头 查找匹配项。

实际上,您也可以在正则表达式的开头添加^并调用re.search(pattern, string),但这是一个非常奇怪的组合。

我也有关于您如何指定条件的评论,可能不完整 方式:您输入$40 million字符串,并指出的拒绝原因 $40之后是空格和字母。

实际上,您应该已经写过要匹配的字符串:

  • 可能以$开头。
  • $之后可以有一个空格(也许我不确定)。
  • 然后可以是数字,点或逗号的序列。
  • 仅此而已。

关于Python文字的另一点评论:显然您忘记了在模式前加上r。 如果使用 r-string文字,则不必在其中加双反斜杠。

所以我认为最自然的解决方案是调用一个专门用于 匹配整个字符串(即fullmatch),而不添加开始/结束 锚点和整个脚本可以是:

import re

pat = re.compile(r'(?:\$\s?)?[\d,.]+')
lines = ["416", "15,704", "$40 million"]
for line in lines:
    if pat.fullmatch(line):
        print(line)

有关正则表达式的详细信息:

  • (?:-一个非捕获组。
    • \$-由一个$字符组成。
    • \s?-和可选的空格。
  • )?-非捕获组的结尾,并且?表示整个组是可选的。
  • [\d,.]+-数字,逗号和点的序列(请注意[之间的数字 和]点代表自身,因此不需要反斜杠引号。

如果您想拒绝诸如2...53.,44之类的字符串(不连续) 允许使用点或逗号),将上述正则表达式的最后一部分更改为:

[\d]+(?:[,.]?[\d]+)*

详细信息:

  • [\d]+-一个数字序列。
  • (?:-一个非捕获组。
    • [,.]-逗号或点()。
    • [\d]+-另一个数字序列。
  • )*-非捕获组的结尾,它可能会出现多次。