Montag, Januar 20, 2020

Mit mehr als einer Flagge in python re.findall

Möchte ich verwenden mehr als eine Flagge mit der re.findall Funktion. Genauer gesagt, ich möchte die IGNORECASE und DOTALL Flaggen zur gleichen Zeit.

x = re.findall(r'CAT.+?END', 'Cat \n eND', (re.I, re.DOTALL))

Fehler :

Traceback (most recent call last):
  File "<pyshell#78>", line 1, in <module>
    x = re.findall(r'CAT.+?END','Cat \n eND',(re.I,re.DOTALL))
  File "C:\Python27\lib\re.py", line 177, in findall
    return _compile(pattern, flags).findall(string)
  File "C:\Python27\lib\re.py", line 243, in _compile
    p = sre_compile.compile(pattern, flags)
  File "C:\Python27\lib\sre_compile.py", line 500, in compile
    p = sre_parse.parse(p, flags)
  File "C:\Python27\lib\sre_parse.py", line 673, in parse
    p = _parse_sub(source, pattern, 0)
  File "C:\Python27\lib\sre_parse.py", line 308, in _parse_sub
    itemsappend(_parse(source, state))
  File "C:\Python27\lib\sre_parse.py", line 401, in _parse
    if state.flags & SRE_FLAG_VERBOSE:
TypeError: unsupported operand type(s) for &: 'tuple' and 'int'

Gibt es eine Möglichkeit, um mehr als eine fahne ?

  • Finden Sie in der Dokumentation zum re.kompilieren.
  • In Ergänzung zu @PeterWood link: docs.python.org/2.7/howto/regex.html#compilation-flags
  • Wenn Sie verwenden eine Menge von regex, ist es immer besser, in-line-Modifikatoren wenn Sie können. Vor allem, weil Sie nicht wirklich mit FLAGS mit der FindAll-Funktion, werden Sie weitergegeben werden und an dem Regulären Ausdruck Objekt. Die Modifikatoren binden Sie an die regex-Objekts, nicht die regex-Nutzung-Funktionen. Also, wenn Sie Ausschneiden und einfügen eine regex irgendwo sonst, Sie müssen nicht sorgen zu machen über die Flaggen überhaupt. Also r'(?si)CAT.+?END' ist der beste Weg.
InformationsquelleAutor Pavan | 2015-06-04

3 Kommentare

  1. 35

    Ja, aber Sie müssen ODER Sie zusammen:

    x = re.findall(r'CAT.+?END','Cat \n eND',re.I | re.DOTALL)
  2. 8

    Können Sie nicht setzen der flags in ein Tupel. Verwenden Sie das pipe-Zeichen (ODER Operanden) innerhalb Ihres flags:

    x = re.findall(r'CAT.+?END','Cat \n eND',flags=re.I | re.DOTALL)

Kostenlose Online-Tests