Режимы Python поддерживают что-то вроде Perl \ G?

У меня есть регулярное выражение Perl (показано здесь , хотя понимание всего этого, надеюсь, не обязательно для ответа на этот вопрос), который содержит метасимвол \ G. Я бы хотел перевести его на Python, но Python, похоже, не поддерживает \ G. Что я могу сделать?

5 Solutions collect form web for “Режимы Python поддерживают что-то вроде Perl \ G?”

Попробуйте эти:

import re re.sub() re.findall() re.finditer() 

например:

 # Finds all words of length 3 or 4 s = "the quick brown fox jumped over the lazy dogs." print re.findall(r'\b\w{3,4}\b', s) # prints ['the','fox','over','the','lazy','dogs'] 

Вы можете использовать re.match для соответствия привязанным шаблонам. re.match будет соответствовать только в начале (позиция 0) текста или указать его.

 def match_sequence(pattern,text,pos=0): pat = re.compile(pattern) match = pat.match(text,pos) while match: yield match if match.end() == pos: break # infinite loop otherwise pos = match.end() match = pat.match(text,pos) 

Это будет соответствовать только шаблону из данной позиции и любым совпадениям, следующим за 0 символами.

 >>> for match in match_sequence(r'[^\W\d]+|\d+',"he11o world!"): ... print match.group() ... he 11 o 

Я знаю, что я немного опаздываю, но вот альтернатива подходу \G :

 import re def replace(match): if match.group(0)[0] == '/': return match.group(0) else: return '<' + match.group(0) + '>' source = '''http://a.com http://b.com //http://etc.''' pattern = re.compile(r'(?m)^//.*$|http://\S+') result = re.sub(pattern, replace, source) print(result) и import re def replace(match): if match.group(0)[0] == '/': return match.group(0) else: return '<' + match.group(0) + '>' source = '''http://a.com http://b.com //http://etc.''' pattern = re.compile(r'(?m)^//.*$|http://\S+') result = re.sub(pattern, replace, source) print(result) 

вывода (через Ideone ):

 <http://a.com> <http://b.com> //http://etc. 

Идея состоит в том, чтобы использовать регулярное выражение, которое соответствует обоим типам строк: URL или прокомментированной строке. Затем вы используете обратный вызов (делегат, закрытие, встроенный код и т. Д.), Чтобы выяснить, какой из них вы согласовали, и вернуть соответствующую заменяющую строку.

На самом деле, это мой предпочтительный подход даже в ароматах, которые поддерживают \G Даже в Java, где я должен написать кучу кода шаблона для реализации обратного вызова.

(Я не парень на Python, так что простите меня, если код ужасно не-pythonic.)

Python не имеет модификатора / g для своего regexen и поэтому не имеет токена \ G regex. Очень жаль.

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

 import re lines = [re.sub(r'http://[^\s]+', r'<\g<0>>', line) for line in text_block.splitlines() if not line.startedwith('//')] print '\n'.join(lines) 

Python обычно не лучший, когда вы буквально переводите с Perl, у него есть собственные шаблоны программирования.

  • Python - Regex - Как найти строку между двумя наборами строк
  • Как использовать регулярные выражения сделать обратный поиск?
  • Как найти текстовое описание смайликов, символов Unicode и emoji в строке (python, perl)?
  • Проблема с регулярными выражениями в python
  • Как добавить конечную косую черту для приложения для категоризации Django MPTT?
  • Удаление непечатаемых символов «gremlin» из текстовых файлов
  • Чтение Python Regex в комментариях стиля c
  • регулярное выражение соответствует первому и последнему слову или любому слову
  • Поддерживает ли Ruby условные регулярные выражения
  • Подгонка всего, кроме буквы - регулярное выражение
  • конвертировать строку dsn в python в kwargs
  • Python - лучший язык программирования в мире.