Python重新搜索数字和小数
我试图使用pythons正则表达式提取数字值(100.00&200.00),但是当我调用代码时,它不会产生任何结果。。。 我使用的是python 2.7版 1) 我的文件名是“file100”,我需要从中选择值Python重新搜索数字和小数,python,python-2.7,Python,Python 2.7,我试图使用pythons正则表达式提取数字值(100.00&200.00),但是当我调用代码时,它不会产生任何结果。。。 我使用的是python 2.7版 1) 我的文件名是“file100”,我需要从中选择值 # cat file100 Hi this doller 100.00 Hi this is doller 200.00 2) 这是我的python代码 # cat count100.py #!/usr/bin/python import re file = open('file100
# cat file100
Hi this doller 100.00
Hi this is doller 200.00
2) 这是我的python代码
# cat count100.py
#!/usr/bin/python
import re
file = open('file100', 'r')
for digit in file.readlines():
myre=re.match('\s\d*\.\d{2}', digit)
if myre:
print myre.group(1)
3) 当我运行这段代码时,它不会产生任何错误。。没什么
# python count100.py
改用:
import re
file = open('file.txt', 'r')
for digit in file.readlines():
myre = re.search(r'\s\b(\d*\.\d{2})\b', digit)
if myre:
print myre.group(1)
结果
100.00
200.00
从文档中:
在字符串中扫描,查找正则表达式所在的第一个位置
表达式模式生成匹配项
如果决定使用组,还需要括号:
(…)匹配括号内的任何正则表达式,
并指示组的开始和结束;组的内容
可以在执行匹配后检索,并且可以进行匹配
后面的字符串中带有\number特殊序列,如下所述
在下面要匹配文本'('或''),请使用(或),或将它们括起来
在字符类内:[(][)]
仅在以下情况下有效:
如果字符串的开头有零个或多个字符与
正则表达式模式
r
将regex
封装为:
字符串文本可以选择前缀字母“r”或“r”;
这些字符串称为原始字符串,并使用不同的规则
解释反斜杠转义序列
除非出现'r'或'r'前缀,否则应在字符串中转义序列
根据与标准C使用的规则类似的规则进行解释
如果它们总是在行的末尾,只需
rsplit
一次并拉动最后一个元素:
with open('file100', 'r') as f:
for line in f:
print(line.rsplit(None, 1)[1])
输出:
100.00
200.00
rsplit(None,1)
只意味着我们从字符串末尾的空白处拆分一次,然后提取第二个元素:
In [1]: s = "Hi this doller 100.00"
In [2]: s.rsplit(None,1)
Out[2]: ['Hi this doller', '100.00']
In [3]: s.rsplit(None,1)[1]
Out[3]: '100.00'
In [4]: s.rsplit(None,1)[0]
Out[4]: 'Hi this doller'
如果确实需要正则表达式,请使用搜索:
import re
with open('file100', 'r') as f:
for line in f:
m = re.search(r"\b\d+\.\d{2}\b",line)
if m:
print(m.group())
您的主要问题是使用的是re.match
,它需要从字符串开头开始进行匹配,而不是re.search
,它允许从字符串中的任意点开始进行匹配。不过,我会详细介绍我的建议:
import re
无需在每个循环上重新编译(Python实际上为您缓存了一些正则表达式,但为了安全起见,将其中一个保留在引用中)。我正在使用VERBOSE
标志来为您拆分正则表达式。在字符串前面使用r
,以便在Python读取字符串时,反斜杠不会转义它们前面的字符:
regex = re.compile(r'''
\s # one whitespace character, though I think this is perhaps unnecessary
\d* # 0 or more digits
\. # a dot
\d{2} # 2 digits
''', re.VERBOSE)
使用上下文管理器并使用通用换行符打开文件,'rU'
模式,这样无论文件是在什么平台上创建的,您都可以逐行读取它
with open('file100', 'rU') as file:
不要使用readlines
,这会立即将整个文件加载到内存中。相反,请将文件对象用作迭代器:
for line in file:
myre = regex.search(line)
if myre:
print(myre.group(0)) # access the first group, there are no
# capture groups in your regex
我的代码打印:
100.00
200.00
这里有几个问题:
.match
仅在字符串开头查找匹配项--请参阅
您没有使用捕获组,因此没有理由使用myre的.group(1)
。group(1)
将包含任何内容
以下是一个更新的示例:
import re
file = """
Hi this doller 100.00
Hi this is doller 200.00
"""
for digit in file.splitlines():
myre = re.search('\s\d*\.\d{2}', digit)
if myre:
print(myre.group(0))
它不使用上下文管理器,它具体化内存中的整个文件,并且每次在循环中重新编译正则表达式<代码>数字
在语义上也是错误的。如果只解决OP main问题,这不是一个代码修订工具,当然可以在许多方面进行改进,但这不是重点。。。欢呼问题是为什么它不起作用,@klashxx给出的答案解释了原因。如果你想改进答案,你可以把它作为一个单独的答案,为什么要否决它?@klashxx-这段精炼代码运行得很好,尽管我正在寻找正则表达式前面的“r”的字面意思,同时我将从python org上读到它。r
使它成为一个原始字符串,因此,在Python解析字符串时,反斜杠不会转义它们前面的字符。您假设在数字之前总是有空格。@AaronHall,您看到OP自己的模式了吗?@Padraic-这很有效,但我期待着用正则表达式来完成。你可以解释下面的代码<代码>(无,1)[1]@pygo,我添加了一个示例,希望能使它成功clear@Padraic-这是非常好的解释。pygo,你觉得我的答案有用吗?旁注:用于文件中的数字。readlines():
是浪费和延迟处理(它在开始迭代之前将整个文件拖到内存中)对于文件中的数字:
进行迭代而不发出咕噜声(因此峰值内存基于最大的输入行,而不是文件的大小)。对于file.readlines()
,实际上没有任何用例;在极少数情况下,您需要一个行列表
而不是在运行时迭代行,列表(文件)
更一般/简洁地实现相同的结果(它适用于任何非无限迭代器,而不仅仅是具有.readlines()
的类似文件的对象)@ShadowRanger我在下面的回答中指出了这一点。我不知道你为什么要使用组(1)
,你的正则表达式中没有捕获组。我相信我已经在下面简要地解释了为什么您应该只使用组(0)
。我也做了简要而精辟的解释,因为我还是python的新手,所以还在学习过程中。如果您喜欢它,您现在可以对它投赞成票,如果它最好地回答了您的问题,您也可以接受它。@Aaron-为什么我们使用重新编译,有必要吗?或者我们可以修剪一下。它有什么用。我还想知道您在前面的评论中使用了什么“上下文管理器”,这是指内存上下文吗?@pygo正则表达式字符串必须先编译,然后才能用于搜索。如果不使用预编译的正则表达式,那么语义就是在每个循环上重新编译搜索。