Группа регулярных выражений, исключая что-то az, но не c - PullRequest
0 голосов
/ 28 мая 2020

Я делаю регулярное выражение, которое будет соответствовать .dom .bom .fom, но НЕ соответствовать .com

Лучшее, что я могу сделать, это:

r"\.[a-bd-z]om"

Любой лучший способ сделать это ???

Ответы [ 5 ]

2 голосов
/ 28 мая 2020

Вот ваше текущее регулярное выражение:

r'\.[a-bd-z]om'

Мы можем переписать это как:

r'\.[^\Wc]om'

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

r'\.(?!com)[a-z]om'

Но на самом деле я предпочитаю вашу текущую версию и не думаю менять ее, если здесь нет более серьезной проблемы.

1 голос
/ 28 мая 2020

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

import re

tests = ['.dom', '.bom', '.fom', '.com']

# alternative 1
pattern = re.compile(r"\.(?!c)[a-z]om")
tested = [test for test in tests if pattern.match(test)]
print(tested)

# alternative 2
pattern = re.compile(r"\.([a-z])om")

def aftertest(item):
    m = pattern.match(item)
    if m:
        return False if m.group(1).startswith("c") else True
    return False

tested = [test for test in tested if aftertest(test)]
print(tested)

Оба подхода дадут

['.dom', '.bom', '.fom']
0 голосов
/ 28 мая 2020

Для поиска с учетом регистра вы можете использовать это

r"\.(?i)[a-bd-z]om"

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

r"\.[^(c|\d)]om"
0 голосов
/ 28 мая 2020

Не могли бы вы попробовать:

r"\.[a-z](?<!c)om"
0 голосов
/ 28 мая 2020

Да, это:

import re

print(re.findall('\.[^c]om','bomcomnom.com.mom'))

Вывод:

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