Аз се обърквам връщайки няколко групи в 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)