регулярное выражение Python: сопоставить строку только с одним экземпляром символа - PullRequest
9 голосов
/ 02 июля 2010

Предположим, есть две строки:

$1 off delicious ham.
$1 off delicious $5 ham.

Могу ли я в Python иметь регулярное выражение, которое соответствует, когда в строке только один $?Т.е. я хочу, чтобы RE совпадал по первой фразе, а не по второй.Я пробовал что-то вроде:

re.search(r"\$[0-9]+.*!(\$)","$1 off delicious $5 ham.")

.., говоря: "Совпадение, где вы видите $, за которым следует что-либо, КРОМЕ другого $".В примере $$ не было совпадений, но в примере $ также не было совпадений.

Заранее спасибо!

Простой метод проверки для проверки:

def test(r):
  s = ("$1 off $5 delicious ham","$1 off any delicious ham")    
  for x in s:
    print x
    print re.search(r,x,re.I)
    print ""

Ответы [ 5 ]

11 голосов
/ 02 июля 2010
>>> import re
>>> onedollar = re.compile(r'^[^\$]*\$[^\$]*$')
>>> onedollar.match('$1 off delicious ham.')
<_sre.SRE_Match object at 0x7fe253c9c4a8>
>>> onedollar.match('$1 off delicious $5 ham.')
>>>

Распределение регулярного выражения:
^ Якорь в начале строки
[^\$]* Ноль или более символов, которые не $
\$ Соответствуют знаку доллара
[^\$]* Ноль или более символов, которые не являются $
$ Якорь в конце строки

8 голосов
/ 02 июля 2010
>>> '$1 off delicious $5 ham.'.count('$')
2
>>> '$1 off delicious ham.'.count('$')
1
2 голосов
/ 02 июля 2010

Вы хотите использовать дополнение класса символов [^] для соответствия любому символу, отличному от $:

re.match(r"\$[0-9]+[^\$]*$","$1 off delicious $5 ham.")

Изменения по сравнению с оригиналом следующие:

  1. .* заменено на [^\$]*.Новый термин [^\$] означает любой символ, отличный от $
  2. $, добавленный в строку.Принудительно расширяет совпадение до конца строки.
  3. re.search заменяется на re.match.Соответствует всей строке, а не любому ее подмножеству.
1 голос
/ 02 июля 2010
^.*?\$[^$]*$

это должно сработать

1 голос
/ 02 июля 2010
re.search("^[^$]*\$[^$]*$",test_string)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...