2015-02-28 3 views
3

Как создать класс регулярных выражений, являющийся пересечением двух других классов регулярных выражений? Например, как я могу найти согласные с [a-z] и [^aeiou] без явного построения регулярных выражений класса, содержащего все согласные, как так:Пересечение двух классов регулярных выражений

[bcdfghjlkmnpqrstvwxyz] # explicit consonant regex class 
+0

проверить это http://stackoverflow.com/questions/469913/regular-expressions-is-there-an-and-operator –

ответ

3

Это регулярное выражение должен сделать трюк: (?=[^aeiou])(?=[a-z]).

Первая группа (?=...) утверждает, что шаблон [^aeiou] могут быть сопоставлены, а затем перезапускает согласование в начале и переходит на второй шаблон (который работает таким же образом), это как logical AND, и весь регулярное выражение будет только если все эти два выражения совпадают.

+2

Вы можете изменить, чтобы (= [^aeiou]) [az], чтобы также зафиксировать матч – davidrac

+0

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

2

В качестве альтернативы re модуль Python, вы можете сделать это в явном виде с regex библиотеки, которая поддерживает набор операций для классов символов:

операторы, в порядке возрастания старшинства:

|| для объединения (“x||y” означает «х или у»)

~~ (двойная тильда) для симметрической разности (“x~~y” означает «х или у, но п а> и»)

&& для пересечения (“x&&y” означает„х и у“)

-- (двойной тир) для разности (“x–y” означает„х, но не у“)

Так соответствовать только согласные, регулярное выражение может быть:

>>> regex.findall('[[a-z]&&[^aeiou]]+', 'abcde', regex.VERSION1) 
['bcd'] 

или, что эквивалентно, используя набор разницы:

>>> regex.findall('[[a-z]--[aeiou]]+', 'abcde', regex.VERSION1) 
['bcd'] 
0

Различия или пересечение классов символов недоступны в модуле re, поэтому что вы можете сделать?

используя диапазоны:

[bcdfghj-np-tv-z] 

с использованием класса \w символов:

[^\W0-9_aeiouAEIOU] 

опережения (не очень эффективно, так как вам нужно сделать тест для каждого персонажа):

(?:(?![eiou])[b-z]) 

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

[[b-z]--[eiou]] 
+0

Что такое модуль регулярных выражений?Это в стандартной библиотеке Python 3 или это внешний пакет? –

+0

@MalikBrahimi: нет, вам нужно добавить его вручную: https://pypi.python.org/pypi/regex –

+0

Будет ли он в конечном итоге стать частью стандартной библиотеки? –

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