我需要匹配文本文档中的行,其中行以数字开头,而数字后没有任何内容。...我想包括以'.'
和','
隔开的数字。 / 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]')
但是它不起作用。原因之一是,事实证明我要匹配的数字后面没有空格。
欣赏所有提示或技巧。
答案 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...5
或3.,44
之类的字符串(不连续)
允许使用点或逗号),将上述正则表达式的最后一部分更改为:
[\d]+(?:[,.]?[\d]+)*
详细信息:
[\d]+
-一个数字序列。(?:
-一个非捕获组。
[,.]
-逗号或点(单)。[\d]+
-另一个数字序列。)*
-非捕获组的结尾,它可能会出现多次。