Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python重新搜索数字和小数_Python_Python 2.7 - Fatal编程技术网

Python重新搜索数字和小数

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

我试图使用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', '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正则表达式字符串必须先编译,然后才能用于搜索。如果不使用预编译的正则表达式,那么语义就是在每个循环上重新编译搜索。