Разбор свободного текста с использованием длинной формулы регулярного выражения, приводящей к ошибке: многократное повторение в python? Скриншот включен - PullRequest
1 голос
/ 06 ноября 2019

Мне нужно разобрать определенные строки из свободного текстового поля в файле .xlsx. Я использую Python 2.7 в Spyder.

РЕДАКТИРОВАТЬ: я избежал "."в формулах регулярных выражений, но я все еще получаю ту же ошибку.

Для этого я использовал pandas для преобразования файла .xslx в фрейм данных pandas:

data = "complaints_data.xlsx"
read_data = pd.read_excel(data)
read_data.dropna(inplace = False)
df = pd.DataFrame(read_data)
df['FMEA Assessment'] = df['FMEA Assessment'].replace({',':''}, regex=True)

Затем я использовалфункция извлечения панд для извлечения моих строковых полей FMEA, Rev и Line с использованием шаблонов регулярных выражений.

fmea_pattern = r'(FMEA\s*\d*\d*\d*\d*\d*|fmea\s*\d*\d*\d*\d*\d*|DOC\s*\-*[0]\d*\d*\d*\d*\d*|doc\s*\-*[0]\d*\d*\d*\d*\d*)'
df[['FMEA']] = df['FMEA Assessment'].str.extract(fmea_pattern, expand=True)

rev_pattern = r'(Rev\.*\s+\D{1,2}+|rev\.*\s+\D{1,2}|REV\.*\s+\D{1,2}|rev\.*\s+\D{1,2})'
df[['REV']] = df['FMEA Assessment'].str.extract(rev_pattern, expand=True)



line_pattern = r'(line item\.*\s*\:*\d{1,3}\d*\.*\D*\.*\d+\d*?\.|Line\.*\s*\:*\d{1,3}\d*\.*\D*\.*\d+\d*?\.|lines\.*\s*\:*\d{1,3}\d*\.*\D*\.*\d+\d*?\.|Lines\.*\s*\:*\d{1,3}\d*\.*\D*\.*\d+\d*?\.|Line item\.*\s*\:*\d{1,3}\d*\.*\D*\.*\d+\d*?\.|LINES\.*\s*\:*\d{1,3}\d*\.*\D*\.*\d+\d*?\.|LINE\.*\s*\:*\d{1,3}\d*\.*\D*\.*\d+\d*?\.)'
df[['LINE']] = df['FMEA Assessment'].str.extract(line_pattern, expand=True)   

Строковые поля, которые мне нужно проанализировать, могут быть введены различными способами, и я учел каждый способ в формулах регулярного выражения и для каждого варианта слова;например, я учел строки, линии, линии, линии, линии и т. д. Я протестировал формулы регулярных выражений по отдельности и по отдельности, и они работают должным образом. Тем не менее, когда я объединяю их все в коде выше, я получаю следующее сообщение об ошибке:

Снимок экрана с сообщением об ошибке

Не могли бы вы помочь мне решить эту проблему?

Кроме того, существует ли другой способ учета вариаций одного и того же слова в одно и то же время (строчные буквы, прописные буквы и заглавные буквы)?

Спасибо!

1 Ответ

0 голосов
/ 06 ноября 2019

Основная ошибка в этом случае связана с тем, что вы используете собственнический квантификатор вместо обычного, непосессорного квантификатора.

Это распространенная ошибка, когда пользователи тестируют свои шаблоны в онлайн-PCREтестеры регулярных выраженийВам необходимо убедиться, что вы ВСЕГДА тестируете свои регулярные выражения в среде (или с опцией механизма регулярных выражений), которая совместима с вашей целевой средой.

Python re не поддерживает собственнические квантификаторы :

{5}+
{5,}+
{5,10}+
++
?+
*+

В этом случае вам просто нужно удалить конечный + из \D{1,2}+:

rev_pattern = r'(Rev\.*\s+\D{1,2}|rev\.*\s+\D{1,2}|REV\.*\s+\D{1,2}|rev\.*\s+\D{1,2})'

Кажется, вы можете просто использовать

rev_pattern = r'((?:[Rr]ev|REV)\.*\s+\D{1,2})' # Will only match Rev, REV and rev at the start
rev_pattern = r'(?i)(Rev\.*\s+\D{1,2})' # Will match any case variations of Rev

См. Демо regex в Regex101, обратите внимание на выбранную слева опцию Python.

Также обратите внимание, что можно сделать целоерегистр нечувствителен, добавляя (?i) в начале шаблона или компилируя регулярное выражение с re.I или re.IGNORECASE аргументами. Это будет «учитывать вариации одного и того же слова в одно и то же время (нижний регистр, верхний регистр и заглавный регистр)».

ПРИМЕЧАНИЕ : если вы действительно хотите использовать квантификатор-собственникВы можете эмулировать собственнический квантификатор с помощью положительного взгляда и обратной ссылки. Однако в Python вам потребуется re.finditer, чтобы получить доступ ко всем значениям совпадений.

...