регулярное выражение Python для строки - PullRequest
2 голосов
/ 22 августа 2010

рассмотрим эту строку

prison break: proof of innocence (2006) {abduction (#1.10)}

я просто хочу узнать, есть ли (# floating point value )} в строке или нет

я пробовал несколько регулярных выражений, таких как

re.search('\(\#+\f+\)\}',xyz) 

и

re.search('\(\#+(\d\.\d)+\)\}',xyz)

ничего не помогло, хотя ... может кто-то предложить мне что-то здесь

Ответы [ 2 ]

3 голосов
/ 22 августа 2010

«Escape all» и используйте необработанный синтаксис для безопасности:

>>> s='prison break: proof of innocence (2006) {abduction (#1.10)}'
>>> re.search(r'\(\#\d+\.\d+\)\}', s)
<_sre.SRE_Match object at 0xec950>
>>> _.group()
'(#1.10)}'
>>> 

Предполагается, что под «значением с плавающей запятой» вы подразумеваете «одну или несколько цифр, точку, одну или несколько цифр» и не допускаете других синтаксических вариаций с плавающей запятой, нескольких хешей (которые появляются в ваших шаблонах RE хотеть поддерживать, но не упоминать в тексте вашего Q), произвольный пробел между соответствующими частями (опять же, из вашего Q непонятно, нужно ли вам это), ... - некоторые проблемы могут быть решены довольно легко, другие "нет так много "(особенно трудно догадаться, какую гамму вариантов синтаксиса FP вы хотите поддерживать, например).

3 голосов
/ 22 августа 2010

Попробуйте r'\(#\d+\.\d+\)\}'

(, ), . и } являются специальными метасимволами, поэтому им предшествует \, поэтому вместо них они встречаются буквально.

Вам также необходимо применить + повторение к нужному элементу. Здесь он прикреплен к \d - сокращенному номеру класса символов - для обозначения того, что только цифры могут появляться один или несколько раз.

Использование r'raw string literals' упрощает работу с шаблонами регулярных выражений, поскольку вам не нужно чрезмерно избегать обратных косых черт.

Смотри также


Изменения

В учебных целях давайте рассмотрим несколько вариантов. Это покажет несколько основных функций регулярных выражений. Давайте сначала рассмотрим один из предпринятых паттернов:

\(\#+(\d\.\d)+\)\}

Давайте разберем детали для удобства чтения:

\( \#+ ( \d \. \d )+ \) \}
       \__________/
         this is one group, repeated with +

Итак, этот шаблон соответствует:

  • Литерал (, за которым следует один или более #
  • Вслед за одним или несколькими из:
    • цифра, буквальная точка и цифра
  • сопровождается литералом )}

Таким образом, шаблон будет соответствовать, например, (###1.23.45.6)} ( как видно на rubular.com ). Очевидно, это не тот шаблон, который нам нужен.

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

BEFORE
\(#\d+\.\d+\)\}
      \___/
      let's make this optional! (…)?

AFTER
\(#\d+(\.\d+)?\)\}

Теперь шаблон соответствует, например. (#1.23)} а также, например, (#666)} ( как видно на rubular.com ).

Ссылки

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