Сократить шаблон регулярного выражения Python - PullRequest
0 голосов
/ 21 сентября 2019

Я импортирую re и использовал ниже re.compile(pattern),

pattern = re.compile('\d+\.\d+\s+[a-z]+\s+[a-z]+\s+\d+(?:\,\d+)?,\d+\s+[a-z]+\s+[a-z]+')

, чтобы получить список из строки,

['2.2 based on 1,135,421 player feedback', 
 '6.0 based on 5,135,421 player feedback', 
 '9.9 based on 421 player feedback', 
 '2.2 based on 135,421 player feedback']

Как могЯ сокращаю шаблон в re.compile, чтобы получить тот же результат?

Спасибо!

Ответы [ 3 ]

1 голос
/ 21 сентября 2019

Исходя из предоставленной вами информации, я бы предложил использовать ее, чтобы сделать сопоставление с образцом намного проще и прозрачнее:

re.compile('\d{1,2}\.\d based on \d{1,3}(?:,\d{3})* player feedback')

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

Я также предположил, что первое число всегда будет содержать ровно две или три цифры - например, 2.2, 6.0, 9.9 или (предположительно)10.0.

И я также предположил, что второе число будет содержать 1-3 цифры, возможно, за которыми следуют ноль или более групп запятых и еще 3 цифры - как 1,135,421, 13,421 или 421.

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

Это довольно ясно, если предположить, что эти четыре примера являются репрезентативными для набора данных в целом.

re.compile(r'\d+\.\d+ based on [\d\,]+ player feedback')

Я полагаю, вы также хотите использовать проанализированные числа.Захват групп и небольшая постобработка могут сделать это.

re_feedback = re.compile(r'(\d+\.\d+) based on ([\d\,]+) player feedback')
m = re_feedback.match('2.2 based on 1,135,421 player feedback')
score_str, n_players_str = m.groups()
score = float(score_str)
n_players = int(n_players_str.replace(',', ''))

score => 2.2
n_players => 1135421
0 голосов
/ 21 сентября 2019

В зависимости от того, какие входные данные у вас могут быть, вы можете уменьшить границы с помощью некоторого выражения, похожего на:

\.?\d*(?:\.\d*)?\sbased on.+?feedback\b

в зависимости от того, что вы определите действительное число.

Тест

import re

expression = r"\.?\d*(?:\.\d*)?\sbased on.+?feedback\b"


string = """
some words there 2.2 based on 1,135,421 player feedback some words here 
6.0 based on 5,135,421 player feedback some words 
here 9.9 based on 421 player feedback some words here 
2.2 based on 135,421 player feedback some words here 
some words there 2 based on 1,135,421 player 
feedback some words here 6. based on 5,135,421 player 
feedback some words here 9.9 based on 421 player feedback some 
words here .1 based on 135,421 player feedback some words here 

"""

print(re.findall(expression, string))

Вывод

['2.2 based on 1,135,421 player feedback', '6.0 based on 5,135,421 player feedback', '9.9 based on 421 player feedback', '2.2 based on 135,421 player feedback', '9.9 based on 421 player feedback', '.1 based on 135,421 player feedback']

Если вы хотите упростить / изменить / изучить выражение, это объяснено в верхней правой панели regex101.com .Если хотите, вы также можете посмотреть в эту ссылку , как она будет сопоставляться с некоторыми примерами ввода.


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