/ / Python RegEx няколко групи - python, regex

Python RegEx няколко групи - python, regex

Аз се обърквам връщайки няколко групи в Python.My RegEx е следното:

lun_q = "Lun:s*(d+s?)*"

И моята струна е

s = """Lun:                     0 1 2 3 295 296 297 298"""`

Връщам съвпадащ обект и след това искам да погледна групите, но всичко това показва последния номер (258):

r.groups()
(u"298",)

Защо не се връщат групи от 0,1,2,3,4 и т.н.?

Отговори:

25 за отговор № 1

Вашият регекс съдържа само една двойка скоби (една група за заснемане), така че да получите само една група в мача. Ако използвате оператор за повторение в група за улавяне (+ или *), групата се "презаписва" всеки път, когато групата се повтаря, което означава, че само последният мач е заловен.

В примера си тук, вероятно си по-добре да използвате .split(), в комбинация с регенерация:

lun_q = "Lun:s*(d+(?:s+d+)*)"
s = """Lun: 0 1 2 3 295 296 297 298"""

r = re.search(lun_q, s)

if r:
luns = r.group(1).split()

# optionally, also convert luns from strings to integers
luns = [int(lun) for lun in luns]

7 за отговор № 2

Понякога е по-лесно без регекс.

>>> s = """Lun: 0 1 2 3 295 296 297 298"""
>>> if "Lun: " in s:
...     items = s.replace("Lun: ","").split()
...     for n in items:
...        if n.isdigit():
...           print n
...
0
1
2
3
295
296
297
298

3 за отговор № 3

Друг подход би бил използването на регенерирането, което трябва да потвърдите вашите данни и след това да използвате по-специфичен регекс, който е насочен към всеки елемент, който искате да извлечете, като използвате итератор на съвпадението.

import re
s = """Lun: 0 1 2 3 295 296 297 298"""
lun_validate_regex = re.compile(r"Lun:s*((d+)(sd+)*)")
match = lun_validate_regex.match(s)
if match:
token_regex = re.compile(r"d{1,3}")
match_iterator = token_regex.finditer(match.group(1))
for token_match in match_iterator:
#do something brilliant

1 за отговор № 4

Ако търсите продукция като 0,1,2,3,4 и т.н. Обикновено отговор е по-долу.

отпечатване на реф.напред ("d", s)