代码之家  ›  专栏  ›  技术社区  ›  Karn Kumar

Python RE搜索数字和十进制[重复]

  •  5
  • Karn Kumar  · 技术社区  · 9 年前

    我试图使用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
    
    4 回复  |  直到 9 年前
        1
  •  2
  •   Juan Diego Godoy Robles    9 年前

    使用 re.search 相反:

    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特殊序列,如所述 在下面要匹配文字“(”或“)”,请使用(或)或将其括起来 字符类内:[(][)]。

    re.match 仅有效:

    如果 上的零个或多个字符 开始 字符串的匹配 正则表达式模式

    r 封闭 regex raw strings :

    字符串文字可以可选地以字母“r”或“r”作为前缀; 这些字符串称为原始字符串,并使用不同的规则 解释反斜杠转义序列。

    ...

    除非 存在“r”或“r”前缀,字符串中的转义序列 根据与标准C类似的规则进行解释

        2
  •  1
  •   Padraic Cunningham    9 年前

    如果他们总是在你的队伍末尾 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'
    

    如果你真的需要正则表达式 search :

    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())
    
        3
  •  1
  •   Aaron Hall    9 年前

    你的主要问题是你正在使用 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
    
        4
  •  -1
  •   Manu Phatak    9 年前

    这里有几个问题:

    1. .match 仅查找字符串开头的匹配项--请参见 search() vs. match() .

    2. 您没有使用捕获组,所以没有理由 .group(1) 属于 myre.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))