Как сопоставить все до первого появления 3–18-значного числа с помощью Regex? - PullRequest
0 голосов
/ 21 октября 2019

Я пытаюсь написать код на Python, который будет соответствовать шаблону текста и сохранен в списке.

Ниже приведены примеры 3 строк из текстового файла:

FY20 Jan 8 Special Buy Event    592586642 - Dummy text Dummy text 
Dummy text Dummy text Dummy text - 592586642, Dummy text Dummy text

FY20 Last Minute Gifts (Next Day/PUT)   "364706825 - dummy text dummy text dummy text dummy text dummy text dummy text dummy text - 364706825 dummy text

FY20 Early Access   484015830 dummy text dummy text dummy text dummy text dummy text dummy text - 484015830 dummy text

Ниже приведено регулярное выражение, которое я использовал:

with open('test.txt', encoding="utf8") as f:
    promo = []
    item = []
    for line in f:
        #yo = re.findall('(FY20[\s\w]+)\t([0-9]+)', line)
        yo = re.findall('(FY20[^\d+]*)+([0-9]*)', line)
        try:
            promo.append(yo[0][0])
            item.append(yo[0][1])
        except:
            continue

Приведенный выше код соответствует всему до появления числа. Он отлично работает для последних 2 строк и сохраняет правильные результаты - тип промо и номер товара в списке. Тем не менее, для первой строки он соответствует только числу «8» и выдает пустой список для item

item = ['', '364706825','484015830']
promo = ['FY20 Jan\t', 'FY20 Jan 8 Special Buy Event\t','FY20 Last Minute Gifts (Next Day/PUT)\t', 'FY20 Early Access\t']

Я хочу, чтобы регулярное выражение совпадало со всем до определенного диапазонацифры встречаются.

item = ['592586642', '364706825','484015830']
promo = ['FY20 Jan 8\t', 'FY20 Jan 8 Special Buy Event\t','FY20 Last Minute Gifts (Next Day/PUT)\t', 'FY20 Early Access\t']

Не беспокойтесь об очистке результатов, сейчас мне нужны только правильные результаты

Я пытался использовать (FY20[^\d+]*)+([0-9]*) и (FY20[^\\d{3,18}]*)+([0-9]*) и многие другие. другие, но не нашли способ пройти через все. Нужно ли использовать условные операторы if-else, чтобы соответствовать этому шаблону?

Ответы [ 3 ]

2 голосов
/ 21 октября 2019

Вы можете попробовать применить шаблоны регулярных выражений на своих примерах на debuggex.com , Регулярное выражение (?P<promo>.*?)(?P<item>\d{3,18}).*.

Попробуйте шаблон групп, например, с помощью groupdict():

Демонстрация отладки

Код :

with open('test.txt', encoding="utf8") as f:
text = f.read()
promo = []
item = []
p = re.compile('(?P<promo>.*?)(?P<item>\d{3,18}).*')
for t in text.split('\n'):
    res = p.search(t)
    if res is not None:
        res_dict = res.groupdict()
        promo.append(res_dict['promo'])
        item.append(res_dict['item'])
print (promo)
print (item)

Использование \d{2}\d+ - для 3 или более цифрили \d{3,18} - от 3 до 18 цифр, если вы хотите прочитать о Python re module . groups() groupdict() не является обязательным, но проще поддерживать long regex .

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

Это работает для меня:

>>> text = '''
... FY20 Jan 8 Special Buy Event 592586642 - Dummy text Dummy text Dummy text Dummy text Dummy text - 592586642, Dummy text Dummy text
... FY20 Last Minute Gifts (Next Day/PUT) "364706825 - dummy text dummy text dummy text dummy text dummy text dummy text dummy text - 364706825 dummy text
... FY20 Early Access 484015830 dummy text dummy text dummy text dummy text dummy text dummy text - 484015830 dummy text
... '''
>>> text = [t for t in text.split('\n') if len(t) > 10]
>>> text
['FY20 Jan 8 Special Buy Event 592586642 - Dummy text Dummy text Dummy text Dummy text Dummy text - 592586642, Dummy text Dummy text', 'FY20 Last Minute Gifts (Next Day/PUT) "364706825 - dummy text dummy text dummy text dummy text dummy text dummy text dummy text - 364706825 dummy text', 'FY20 Early Access 484015830 dummy text dummy text dummy text dummy text dummy text dummy text - 484015830 dummy text']
>>> for t in text :
...     re.findall( r'\d{3,18}', t )
... 
['592586642', '592586642']
['364706825', '364706825']
['484015830', '484015830']
>>> for t in text :
...     pattern = re.findall( r'\d{3,18}', t )
...     print t[:t.find(pattern[0])]
... 
FY20 Jan 8 Special Buy Event 
FY20 Last Minute Gifts (Next Day/PUT) "
FY20 Early Access 
>>>

Я использую re, чтобы найти нужное вам число, затем просто простую манипуляцию строкой, чтобы найти этот шаблон и распечатать результат.

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

Используйте это регулярное выражение:

Регулярное выражение:

FY20(.*?)(\d{3,18})

Демонстрация: Здесь

Пример Python:

import re


text = '''
FY20 Jan 8 Special Buy Event 592586642 - Dummy text Dummy text Dummy text Dummy text Dummy text - 592586642, Dummy text Dummy text

FY20 Last Minute Gifts (Next Day/PUT) "364706825 - dummy text dummy text dummy text dummy text dummy text dummy text dummy text - 364706825 dummy text

FY20 Early Access 484015830 dummy text dummy text dummy text dummy text dummy text dummy text - 484015830 dummy text
'''

res = re.findall(r'FY20(.*?)(\d{3,18})',text)
print(res)

Демонстрация: Здесь

Выход:

[(' Jan 8 Special Buy Event ', '592586642'), (' Last Minute Gifts (Next Day/PUT) "', '364706825'), (' Early Access ', '484015830')]

PS: для включения FY20 используйте это регулярное выражение (FY20.*?)\d{3,18}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...