Regex | многострочный сбой питона - PullRequest
0 голосов
/ 22 мая 2019

Итак, у меня есть несколько документов, из которых я извлекаю дату, мое выражение регулярного выражения:

query = """([0-9]{1,2})?\s{1,2}([jJ]anurary|[fF]eburary|[mM]arch|[aA]pril
    |[mM]ay|[jJ]une|[jJ]uly|[aA]ugust|[sS]eptember|[oO]ctober|[jJ]anuary
    |[nN]ovember|[dD]ecember|[jJ]an|[fF]eb|[mM]ar|[aA]pr|[aA]ug|[sS]ep|[sS]ept
    |[oO]ct|[nN]ov|[dD]ec|[fF]ebruary)\s{1,2}([0-9]{2,4})"""

OR

query = """([0-9]{1,2})?\s{1,2}([jJ]anurary|[fF]eburary|[mM]arch|[aA]pril|
    [mM]ay|[jJ]une|[jJ]uly|[aA]ugust|[sS]eptember|[oO]ctober|[jJ]anuary|
    [nN]ovember|[dD]ecember|[jJ]an|[fF]eb|[mM]ar|[aA]pr|[aA]ug|[sS]ep|[sS]ept|
    [oO]ct|[nN]ov|[dD]ec|[fF]ebruary)\s{1,2}([0-9]{2,4})"""

Единственное различие между ними состоит в том, что один имеет | в начале новой каждой строки, а другой - в конце новой строки. Эти два соответствуют разным вещам - в частности, с | в конце строки я не совпаду с маем, но если в начале строки я не совпаду с январем (при условии, что остальная часть дня & yr & space правильные - я буквально просто перемещаю позицию or вокруг и то, что я просто соответствовал, я больше не соответствую и наоборот). Я делаю что-то не так, есть ли способ обойти это, или есть правильный способ сделать это вместо этого? Очевидно, что цель состоит в том, чтобы соответствовать обоим. Если вы хотите попробовать сами, я могу легко повторить случаи «8 мая 2018 года» и «25 января 2018 года».

Остальная часть моего кода просто re.search (query, doc) (что не соответствует).

Примечание - регулярное выражение Python 3.6.8 == 2018.1.10

Ответы [ 2 ]

1 голос
/ 22 мая 2019

Как несколько человек упомянули в комментариях, вы должны попробовать re.X (или re.VERBOSE)

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

query = """
# Day
([0-9]{1,2})?
\s{1,2}
# Long month
([jJ]anurary|[fF]eburary|[mM]arch
|[aA]pril|[mM]ay|[jJ]une
|[jJ]uly|[aA]ugust|[sS]eptember
|[oO]ctober|[nN]ovember|[dD]ecember
# Short month
|[jJ]an|[fF]eb|[mM]ar|[aA]pr|[aA]ug
|[sS]ept?|[oO]ct|[nN]ov|[dD]ec)
\s{1,2}
# Year
([0-9]{2,4})"""

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

Кроме того, вы, вероятно, захотите скомпилировать свое регулярное выражение, если вы используете его больше, чемодин раз.Таким образом, вы будете использовать его как pattern = re.compile(query, re.X) или pattern = re.compile(query, re.VERBOSE).

0 голосов
/ 22 мая 2019

Когда вы вводите строку с тройными кавычками, записываются все символы в тройных кавычках, , включая \n. Вот как на самом деле выглядит ваша строка запроса:

>>> query = """([0-9]{1,2})?\s{1,2}([jJ]anurary|[fF]eburary|[mM]arch|[aA]pril|
... [mM]ay|[jJ]une|[jJ]uly|[aA]ugust|[sS]eptember|[oO]ctober|[jJ]anuary|
... [nN]ovember|[dD]ecember|[jJ]an|[fF]eb|[mM]ar|[aA]pr|[aA]ug|[sS]ep|[sS]ept|
... [oO]ct|[nN]ov|[dD]ec|[fF]ebruary)\s{1,2}([0-9]{2,4})"""
>>> query
'([0-9]{1,2})?\\s{1,2}([jJ]anurary|[fF]eburary|[mM]arch|[aA]pril|\n    [mM]ay|[jJ]une|[jJ]uly|[aA]ugust|[sS]eptember|[oO]ctober|[jJ]anuary|\n    [nN]ovember|[dD]ecember|[jJ]an|[fF]eb|[mM]ar|[aA]pr|[aA]ug|[sS]ep|[sS]ept|\n    [oO]ct|[nN]ov|[dD]ec|[fF]ebruary)\\s{1,2}([0-9]{2,4})'

Избегайте этого, используя \ продолжение строки для ввода строки в несколько строк:

query = r"([0-9]{1,2})?\s{1,2}([jJ]anurary|[fF]eburary|[mM]arch|[aA]pril|[mM]ay|[jJ]une|[jJ]uly|[aA]ugust|" \
        r"[sS]eptember|[oO]ctober|[jJ]anuary|[nN]ovember|[dD]ecember|[jJ]an|[fF]eb|[mM]ar|[aA]pr|[aA]ug|[sS]ep|" \
        r"[sS]ept|[oO]ct|[nN]ov|[dD]ec|[fF]ebruary)\s{1,2}([0-9]{2,4})"

Вы также можете сохранить свои тройные кавычки и подавить новую строку с помощью \ (помните, что вы не можете сделать отступ для строк ниже первой, потому что эти пробелы / табуляции будут включены в строку):

query = """([0-9]{1,2})?\s{1,2}([jJ]anurary|[fF]eburary|[mM]arch|[aA]pril|\
[mM]ay|[jJ]une|[jJ]uly|[aA]ugust|[sS]eptember|[oO]ctober|[jJ]anuary|\
[nN]ovember|[dD]ecember|[jJ]an|[fF]eb|[mM]ar|[aA]pr|[aA]ug|[sS]ep|[sS]ept|\
[oO]ct|[nN]ov|[dD]ec|[fF]ebruary)\s{1,2}([0-9]{2,4})"""

См. Также: Pythonic способ создания длинной многострочной строки

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