Как мне написать регулярное выражение для следующего шаблона в Python? - PullRequest
0 голосов
/ 05 марта 2009

Как мне найти следующий шаблон с использованием регулярного выражения в python? для двух случаев

ищу стр2 после знака "="

  • Дело 1: str1=str2
  • Дело 2: str1 = str2

обратите внимание, что может быть пробел или нет между обеими сторонами знака "="

Моя такая же, но работает только для одного из случаев!

m=re.search('(?<=str\s\=\s)\w+','str = str2')

возвращает стр2

Помощь!

Гаф

Ответы [ 8 ]

8 голосов
/ 05 марта 2009

если у вас действительно есть только такие простые строки для разбора, вам не нужно регулярное выражение. вы можете просто разбить на = и удалить (или даже lstrip) последний элемент полученного кортежа:

>>> case = 'str = str2'
>>> case.partition('=')[2].lstrip()
'str2'

это будет намного быстрее, чем регулярные выражения. и просто чтобы показать, как быстро я сделал простой тест:

>>> timeit.timeit("'str1 = str2 '.partition('=')[2].strip()")
0.49051564213846177
>>> timeit.timeit("'str1 = str2 '.split('=')[1].strip()")
0.97673281637025866
>>> timeit.timeit('import re')
0.65663786250422618
3 голосов
/ 05 марта 2009
re.search(r'=\s*(.*)', 'str = str2').group(1)

или если вам нужно только одно слово:

re.search(r'=\s*(\w+)', 'str = str2').group(1)

Расширен до конкретной начальной строки:

re.search(r'\bstr\s*=\s*(\w+)', 'str=str2').group(1)

\b = граница слова, поэтому не будет совпадать "somestr=foo"

Было бы быстрее пройти через все варианты один раз, вместо того, чтобы искать один вариант по одному:

option_str = "a=b, c=d, g=h"
options = dict(re.findall(r'(\w+)\s*=\s*(\w+)', option_str))
options['c']  # -> 'd'
1 голос
/ 10 марта 2009

Просто используйте функцию разделения

1 голос
/ 05 марта 2009

Если ваши данные фиксированы, то вы можете сделать это без использования регулярных выражений. Просто разделите его на '='. Например:

>>> case1 = "str1=str2"
>>> case2 = "str1 = str2"

>>> str2 = case1.split('=')[1].strip()
>>> str2 = case2.split('=')[1].strip()

Это YOURCASE.split('=')[1].strip() утверждение будет работать для любых случаев.

0 голосов
/ 06 марта 2009

Схожая идея: использование графического инструмента регулярных выражений полезно при попытке выяснить правильный шаблон: http://kodos.sf.net.

0 голосов
/ 05 марта 2009

Два случая:

  • (случай 1), если перед '=' стоит один пробел, то должен также быть один пробел после '='

    m=re.search(r'(?<=\S)(?:\s=\s|=)(\w+)','str = str2')
    print m.group(1)
    
  • (случай 2) в противном случае,

    m=re.search(r'(?<=\S)\s?=\s?(\w+)','str = str2')
    print m.group(1)
    

В первом случае вы также можете использовать конструкцию "(? P = ..." для второго пробела или ее отсутствия, но она все равно не будет работать для положительного взгляда за утверждением , поскольку это не будет подвыражение постоянной длины.

0 голосов
/ 05 марта 2009

Расширяя ответ @ batbrat и другие предложения, вы можете использовать re.split() для разделения входной строки. Шаблон может использовать \s (пробел) или явный пробел.

>>> import re
>>> c1="str1=str2"
>>> c2="str1 = str2"
>>> re.split(' ?= ?',c1)
['str1', 'str2']
>>> re.split(' ?= ?',c2)
['str1', 'str2']
>>> re.split(r'\s?=\s?',c1)
['str1', 'str2']
>>> re.split(r'\s?=\s?',c2)
['str1', 'str2']
>>> 
0 голосов
/ 05 марта 2009

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

>>> case1 = "str1=str2"
>>> case2 = "str1 = str2"
>>> case2.split()
['str1', '=', 'str2']
>>> ''.join(case2.split())
'str1=str2'
>>> case1[5:]
'str2'
>>> ''.join(case2.split())[5:]
'str2'
>>> 

Успение

Полагаю, вы ищете конкретный токен 'str1'. Я также предполагаю, что str1 могут быть назначены разные значения. Что-то вроде того, что у вас есть в файле конфигурации => propertyName = value.

Это только мое мнение.

Я знал, что возможны другие пути! SilentGhost предлагает хорошую (лучшую!) Альтернативу.

Надеюсь, это поможет.

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