Что неправильно в поиске `?: ((Xxxx) | (yyyy) | (zzzz)) +` в `x = y + z` - PullRequest
0 голосов
/ 23 октября 2019

Код:

import re    
r = re.search("?:((xxxx)|(yyyy)|(zzzz))+", "x = y + z")

Сообщение об ошибке:

D:/FILE_MGMT_PYTHON/ghqer4tqaery.py
Traceback (most recent call last):
  File "D:/FILE_MGMT_PYTHON/ghqer4tqaery.py", line 4, in <module>
    r = re.search("?:((xxxx)|(yyyy)|(zzzz))+", "x = y + z")
  File "C:\Users\Sam\AppData\Local\Programs\Python\Python38-32\lib\re.py", line 199, in search
    return _compile(pattern, flags).search(string)
  File "C:\Users\Sam\AppData\Local\Programs\Python\Python38-32\lib\re.py", line 302, in _compile
    p = sre_compile.compile(pattern, flags)
  File "C:\Users\Sam\AppData\Local\Programs\Python\Python38-32\lib\sre_compile.py", line 764, in compile
    p = sre_parse.parse(p, flags)
  File "C:\Users\Sam\AppData\Local\Programs\Python\Python38-32\lib\sre_parse.py", line 948, in parse
    p = _parse_sub(source, state, flags & SRE_FLAG_VERBOSE, 0)
  File "C:\Users\Sam\AppData\Local\Programs\Python\Python38-32\lib\sre_parse.py", line 443, in _parse_sub
    itemsappend(_parse(source, state, verbose, nested + 1,
  File "C:\Users\Sam\AppData\Local\Programs\Python\Python38-32\lib\sre_parse.py", line 668, in _parse
    raise source.error("nothing to repeat",
re.error: nothing to repeat at position 0

Process finished with exit code 1

Ответы [ 2 ]

3 голосов
/ 23 октября 2019

Регулярное выражение начинается с метасимвола ?. ? означает «предыдущая вещь ноль или один раз». Если вы поставите ? в начале регулярного выражения, то, как утверждает ошибка, нечего повторять ноль или более раз, поэтому регулярное выражение недопустимо.

Изменение порядка регулярных выражений на (?:(xxxx)|(yyyy)|(zzzz))+ приведет к тому, что (?: будет интерпретироваться как группа без захвата, как я полагаю, вы намереваетесь.

0 голосов
/ 23 октября 2019

?: Соответствует предшествующему подвыражению ноль или один раз.


Вам это нужно?

import re    
r = re.search("(?:(x))|(?:(y))|(?:(z))+", "x = y + z")
print(r.groups())  # But re.search() will only return the first successful matched result

или найдите все переменные в уравнении? Как это:

import re    
r = re.findall(" *([xyz])+ *", "x = y + z", re.I)
print(r)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...