Выражение до комментария или до конца строки - PullRequest
3 голосов
/ 01 июня 2009

Хотя этот вопрос похож на эту тему

Я думаю, что я мог сделать что-то не так во время создания кода с помощью регулярного выражения.

Я хочу сопоставить что-либо в строке до комментария ("#") или до конца строки (если у него нет комментария).

Я использую регулярное выражение: (.*)(#|$)

(.*) = Все
(#|$) = комментарий или конец строки

код:

OPTION = re.compile(r'(?P<value>.*)(#|$)')
file = open('file.txt')
lines = file.read()
for line in lines.split('\n'):
    get_match = OPTION.match(line)
    if get_match:
        line_value = get_match.group('value')
        print "Match=  %s" % line_value

Вышеуказанное работает, но не удаляет комментарий. Если в файле есть строка вроде:

this is a line   # and this is a comment

Я все еще получаю всю строку при запуске кода.

Я пропускаю дополнительные значения / информацию в регулярном выражении или мне нужно изменить код?

Ответы [ 4 ]

7 голосов
/ 01 июня 2009

* является жадным (потребляет столько строк, сколько может) и, следовательно, занимает всю строку (после # и до конца строки). Замените ". *" На ". *?" и это будет работать.

См. Регулярное выражение HOWTO для получения дополнительной информации.

3 голосов
/ 01 июня 2009

Вот правильное регулярное выражение, чтобы сделать что-то вроде этого:

([^#]*)(#.*)?

Кроме того, почему бы вам просто не использовать

file = open('file.txt')
for line in file:
1 голос
/ 01 июня 2009

@ Can, @Benji и @ ΤΖΩΤΖΙΟΥ дают три отличных решения, и им интересно послушать, как быстро они соответствуют (вот для чего timeit - забавные бессмысленные микротесты ;-). E.g.:

$ python -mtimeit -s'import re; r=re.compile(r"([^#]*)(#.*)?"); s="this is a line   # and this is a comment"' 'm=r.match(s); g=m.group(1)'
100000 loops, best of 3: 2.02 usec per loop

против

$ python -mtimeit -s'import re; r=re.compile(r"^(.*?)(?:#|$)"); s="this is a line   # and this is a comment"' 'm=r.match(s); g=m.group(1)'
100000 loops, best of 3: 4.19 usec per loop

против

$ python -mtimeit -s'import re; r=re.compile(r"(.*?)(#|$)"); s="this is a line   # and this is a comment"' 'm=r.match(s); g=m.group(1)'
100000 loops, best of 3: 4.37 usec per loop

и победителем становится ... смесь шаблонов! -)

$ python -mtimeit -s'import re; r=re.compile(r"(.*?)(#.*)?"); s="this is a line   # and this is a comment"' 'm=r.match(s); g=m.group(1)'
1000000 loops, best of 3: 1.73 usec per loop

Отказ от ответственности: конечно, если бы это было реальное тестирование производительности, и скорость действительно имела значение, можно было бы примерить множество различных и релевантных значений для s, на тестах, выходящих за рамки такого микробенчмарка, и т. Д., И т. Д. Но я все же нахожу timeit неиссякаемый источник веселья! -)

0 голосов
/ 01 июня 2009

Используйте это регулярное выражение:

^(.*?)(?:#|$)

При использовании не жадного модификатора (?) выражение .* будет совпадать с , как только , когда будет достигнут либо знак хеша, либо конец строки. По умолчанию это значение соответствует много , поэтому вы всегда получаете всю строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...