Я пытаюсь получить значения цифр (100,00 и 200,00) с помощью регулярных выражений Python, но когда я вызываю код, он ничего не дает ... Я использую 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
Karn Kumar 21 Дек 2015 в 23:43

4 ответа

Лучший ответ

Вместо этого используйте 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 в виде необработанных строк :

Строковые литералы могут иметь префикс с буквой 'r' или 'R'; такие строки называются необработанными и используют разные правила для интерпретации escape-последовательностей с обратной косой чертой.

...

Если нет префикса 'r' или 'R', escape-последовательности в строках интерпретируются в соответствии с правилами, аналогичными тем, которые используются в стандарте C

2
Juan Diego Godoy Robles 8 Янв 2016 в 20:26

Здесь есть пара проблем:

  1. .match ищет совпадения только в начале строки - см. search () против 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))
-1
Manu Phatak 21 Дек 2015 в 21:01

Если они всегда находятся в конце ваших строк, просто 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())
1
Padraic Cunningham 21 Дек 2015 в 21:32

Ваша основная проблема заключается в том, что вы используете 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
1
Aaron Hall 21 Дек 2015 в 21:54