Grep Несколько слов из строки в python - PullRequest
0 голосов
/ 29 января 2020

Формат строки и ожидаемый результат ..

>>>a = 'afd fdfe {a.b.c} fdferef {c.d.f}dfefe dfefffe + fdfef {}'
>>>{a.b.c},{c.d.f},{}

Я попытался с помощью следующего кода. И результат ...

>>>re.search(r'{.*.}',a).group()
>>>{a.b.c} fdferef {c.d.f}dfefe dfefffe + fdfef {}'

Другой

>>>re.search(r'{.?*.}',a).group()
>>>Traceback (most recent call last):
     File "<stdin>", line 1, in <module>
   File "/usr/lib/python2.7/re.py", line 146, in search
     return _compile(pattern, flags).search(string)
   File "/usr/lib/python2.7/re.py", line 251, in _compile
     raise error, v # invalid expression
   sre_constants.error: multiple repeat

Ответы [ 2 ]

1 голос
/ 29 января 2020

Вы, похоже, не понимаете значения ., * и ?.

. - метасимвола, который соответствует одному символу (например, a или . или {, или иногда - но не всегда - перевод строки).

* - это метасимвол, который повторяет предыдущее регулярное выражение ноль или более раз. (Например, .* соответствует пустой строке или всему, возможно, за исключением символов новой строки.)

?, поскольку одиночный метасимвол повторяет предыдущее регулярное выражение ноль или один раз. (Например, .? не соответствует ни одному символу или одному символу, возможно, за исключением символов новой строки).

Существуют также комбинации; например, *? говорит, что нужно повторять ноль или более раз, но предпочитает как можно меньше повторений («не жадное» или «скупое» сопоставление).

Для группировки используются круглые скобки; если вы хотите использовать .group(), вам, вероятно, следует использовать круглые скобки вокруг совпадений, которые вы хотите извлечь.

С этим, попробуйте

re.findall(r'(\{[^{}]*\})', a)

где [^{}] соответствует одному символу, который не является фигурной скобкой, а обратная косая черта sh экранирует фигурные скобки, которые в противном случае также являются метасимволом регулярного выражения для указания определенного числа повторений (например, .{3} соответствует трем произвольным символам, а \?{5,} соответствует пяти или более буквальным вопросительным знакам).

Если вы хотите, чтобы l oop совпадало, возможно, предпочтительнее генератор re.finditer(), чем re.findall().

0 голосов
/ 05 февраля 2020
a = ' 45 54 '
True
b = ' 45'
True
c = '45 '
True 
d = '45'
False
e = 'er 44 434'
False

Хотите найти и проверить пробел перед словами и после слов

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