2015-12-30 5 views
0

Я знаю, что в regex мы можем использовать ^, чтобы объявить что-либо, кроме. Например, [^ ]*? означает строку без пробела. Как мы можем использовать это, чтобы найти за исключением более двух последовательных символов. Fro пример строки, которая не содержит {{, когда она может содержать один {. Я попробовал это и не получилось:Regex и python для выражения, не совпадающего с несколькими последовательными символами

re.compile(r"(\{\{`[^(\{\{)]*?\}\}`) 
re.compile(r"(\{\{`[^\{\{]*?\}\}`) 

Это поймать строки в файле, который начинается с {{ и заканчивается }} но не содержит }} в то время как они могут содержать один }. Кроме того, использование .* не является вариантом.

input_string="blah blah blah {{cite journal |last=Malatesta|first=Errico|title=Towards Anarchism|journal=MAN!|publisher=International Group of San Francisco|location=Los Angeles|oclc=3930443|url=http://www.marxists.org/archive/malatesta/1930s/xx/toanarchy.htm|archiveurl=http://web.archive.org/web/20121107221404/http://marxists.org/archive/malatesta/1930s/xx/toanarchy.htm|archivedate=7 November 2012 |deadurl=no|authorlink=Errico Malatesta |ref=harv}} blah blah blah" 
regexp_1 = re.compile(r"(\{\{[^\}]*?\}\})") 
output = regexp_1.sub("",input_string) 

Теперь regexp_1, я хочу, чтобы заменить [^\}]*? с [^\}\}]*?, и я знаю, что [^\}\}]*? не является правильным, поскольку она работает так же, как [^\}]*?.

+0

Ну, чтобы начать то, что вы показали в своем коде здесь не будет компилировать, это недостающие скобки и кавычки. Не могли бы вы также привести пример текста, который вы хотели бы проанализировать, пожалуйста? – themantalope

+0

Насколько я знаю, вы не можете использовать что-то вроде '[^ word]', поскольку это будет соответствовать только любому символу, но 'w',' o', 'r',' d'. Также я знаю, что вы можете использовать негативные образы, такие как 'myword (?! Something)', чтобы соответствовать 'myword', только если за ним не следует' something'. Тем не менее, я знаю, что есть какие-то трюки, которые могут соответствовать любым словам, кроме слова –

+0

, можете ли вы разместить некоторые образцы данных для чего хотите, а что нет? –

ответ

0

Для этого случая можно использовать negative look ahead:

^((?!}}).)*$ 

И для ловли строки между {{ и }} вы можете использовать re.search() с вышеупомянутым регулярным выражением.

>>> s = 'this {{ is {a} sample }}text' 
>>> re.search(r'{{(((?!}}).)*)}}',s).group(1) 
' is {a} sample ' 
1

Это поймать строки в файле, который начинается с {{и заканчивается}}, но не содержит}} в то время как они могут содержать один}

your_string = "{{first group}} {{second {} group}}" 
pattern = re.compile(r'{{.*?}}') 
pattern.findall(your_string) # returns list of matches 

Что вернет

['{{first group}}', '{{second {} group}}'] 
+0

не совсем подходит. Plz взгляните на мой пример. – Nick

+0

Конечно, обновленный ответ. –

+0

Использование '. *' Вне уравнения. Я знаю, что могу использовать '. *', Но я хочу этого избежать. – Nick

1

Похоже, что вы на самом деле хотите совместить первый}} после {. Самое легкое regexp, которое будет делать это:

\{\{.*?\}\} 

Обязательно настройте. для соответствия разрывов строк, если вы разрешаете им находиться внутри.

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

1) Используйте negative lookahead

\{\{((?!\}\}).)*\}\} 

имеют сравнимую производительность, как у вас будет смотреть вперед проверить для каждого символа

2) Используйте atomic group и possessive quantifier

\{\{(?>[^{]|\{[^{])**\}\} 

Этот на самом деле может быть быстрее, поскольку из-за использования «?>» и «**» конструкция не будет погружать уже согласованные значения - так что wil Я делаю все с одним прогоном. P.S .: Убедитесь, что ваш двигатель regexp поддерживает эти конструкции.

+0

Это еще не работает. Plz посмотрите на мой пример в вопросе. – Nick

+0

@ Ник я обновил ответ, чтобы соответствовать тому, что вы имели в виду. P.S .: Ваше название вопроса на самом деле не отражает то, что вы имели в виду. – Dmitry

+0

Спасибо. Как я уже говорил, я хочу избежать '. *', Так как это добавит намного больше в сложность моего регулярного выражения. – Nick

0

Насколько я знаю, вы не можете использовать что-то вроде [^word], так как это будет соответствовать только характер, но независимо w, o, r, d.

Также я знаю, что вы можете использовать отрицательные образы, такие как myword(?!something), чтобы соответствовать myword, только если за ним не следует something.

Однако, чтобы соответствовать то, что не слово, которое я знаю, что вы должны использовать некоторые приемы, как то, что описано в этом посте Match everything except for specified strings

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

^(?!.*\{\{) 

Regex Demo

с другой стороны, если вы используете PCRE регулярное выражение, то вы можете использовать сброшенный ве РБС, так что если вы хотите, чтобы пропустить картины, как {{something}}, вы можете использовать это:

\{\{\w+\}\}(*SKIP)(*FAIL)|(\w+) 
      ^^^^^^^^^^^^^^ if your pattern matches, it will be discarded intentionally 

Working demo

+0

Я знаю, что не могу использовать '[^ word]'. Но если я хочу сказать «слово» с отрицанием, тогда как это может работать? Я не хочу использовать '. *', Так как строка длинна и добавляется к шагам. – Nick

+0

@ Ник не существует способа пропустить слово, используя встроенную функцию, за исключением того, что вы используете отбрасывающие глаголы. Я обновил свой ответ тем, что –

Смежные вопросы