У меня есть список строк, и я хочу, чтобы все строки заканчивались на _1234, где 1234 может быть любым 4-значным числом. Идеально найти все элементы, и что на самом деле представляют собой цифры, или, по крайней мере, вернуть 1-й соответствующий элемент и что такое 4-значная цифра.

Например, у меня есть

['A', 'BB_1024', 'CQ_2', 'x_0510', 'y_98765']

Я хочу получить

['1024', '0510']

Хорошо, пока что я получил, _\d{4}$ будет соответствовать _1234 и вернет объект сопоставления, а match_object.group(0) - фактическая совпадающая строка. Но есть ли лучший способ искать _\d{4}$, но возвращать только \d{4} без _?

0
LWZ 29 Авг 2017 в 01:28

5 ответов

Лучший ответ

Используйте re.search():

import re

lst = ['A', 'BB_1024', 'CQ_2', 'x_0510']
newlst = []

for item in lst:
    match = re.search(r'_(\d{4})\Z', item)
    if match:
        newlst.append(match.group(1))

print(newlst)  # ['1024', '0510']

Что касается регулярного выражения, то шаблон соответствует подчеркиванию и ровно 4 цифрам в конце строки, захватывая только цифры (обратите внимание на парены). Затем захваченная группа доступна через match.group(1) (помните, что group(0) - это полное совпадение).

1
Eugene Yarmash 28 Авг 2017 в 23:07

Попробуй это:

[s[-4:] for s in lst if s[-4:].isdigit() and len(s) > 4]

Просто проверьте последние четыре символа, если это число или нет. добавил len(s) > 4, чтобы исправить ошибку, указанную Джораном.

-1
Eugene Yarmash 14 Сен 2017 в 06:51
import re

src = ['A', 'BB_1024', 'CQ_2', 'x_0510', 'y_98765', 'AB2421', 'D3&1345']

res = []
p = re.compile('.*\D(\d{4})$')
for s in src:
    m = p.match(s)
    if m:
        res.append(m.group(1))

print(res)

Работает нормально, \ D означает не число, поэтому он будет соответствовать 'AB2421', 'D3 & 1345' и так далее.

1
Yi Xin 7 Окт 2017 в 23:03

Пожалуйста, покажите какой-нибудь код в следующий раз, когда вы зададите вопрос, даже если он не работает вообще. Людям легче помочь вам.

Если вы заинтересованы в решении без каких-либо регулярных выражений, вот способ со списком:

>>> data = ['A', 'BB_1024', 'CQ_2', 'x_0510', 'y_98765']
>>> endings = [text.split('_')[-1] for text in data]
>>> endings
['A', '1024', '2', '0510', '98765']
>>> [x for x in endings if x.isdigit() and len(x)==4]
['1024', '0510']
0
Eric Duminil 14 Сен 2017 в 07:48

Попробуйте этот код:

r = re.compile(".*?([0-9]+)$")
newlist = filter(r.match, mylist)
print newlist
-2
Eugene Yarmash 14 Сен 2017 в 07:43