Помощь по проблеме регулярных выражений - PullRequest
2 голосов
/ 24 июля 2010

Интересно, можно ли создать RegEx для следующего шаблона данных:

'152: Ашкенази A, Бенлифер A, Коренблит J, Silberstein SD.'

string = '152: Ashkenazi A, Benlifer A, Korenblit J, Silberstein SD.'

IЯ использую это регулярное выражение (используя модуль re Python) для извлечения этих имен:

re.findall(r'(\d+): (.+), (.+), (.+), (.+).', string, re.M | re.S)

Результат:

[('152', 'Ashkenazi A', 'Benlifer A', 'Korenblit J', 'Silberstein SD')]

Теперь пытаюсь с другим числом (меньше 4 или больше 4) шаблона данных имени больше не работает, потому что RegEx ожидает найти только 4 из них:

(.+), (.+), (.+), (.+).

Я не могу найти способ обобщить этот шаблон.

Ответы [ 4 ]

6 голосов
/ 24 июля 2010

Регулярное выражение, вероятно, не лучший способ решить эту проблему. Вы можете использовать split():

>>> s = '152: Ashkenazi A, Benlifer A, Korenblit J, Silberstein SD.'
>>> s.split(": ")
['152', 'Ashkenazi A, Benlifer A, Korenblit J, Silberstein SD.']
>>> s.split(": ")[1].split(", ")
['Ashkenazi A', 'Benlifer A', 'Korenblit J', 'Silberstein SD.']
1 голос
/ 24 июля 2010

Это должно сработать, если вы хотите, чтобы материал только после чисел:

re.findall(r'\d+: (.+)(?:, .+)*\.', input, re.M | re.S)

И если вы хотите все:

re.findall(r'(\d+): (.+)(?:, .+)*\.', input, re.M | re.S)

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

re.findall(r'[^,]+,|[^,]+$', re.findall(r'\d+: (.+)(?:, .+)*\.', input, re.M | re.S)[0],re.M|re.S)
0 голосов
/ 24 июля 2010

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

код

import re
string1 = '152: Ashkenazi A, Benlifer A, Korenblit J, Silberstein SD.'
string2 = '152: Ashkenazi A, Benlifer A, Korenblit J, Silberstein SD, Hattingh CJR.'
for i in [string1, string2]:
    print re.findall(r'(\d+):|(?:[.,\s?])?(.*?)(?:[.,])', i)

выход

[('152', ''), ('', 'Ashkenazi A'), ('', 'Benlifer A'), ('', 'Korenblit J'), ('', 'Silberstein SD')]
[('152', ''), ('', 'Ashkenazi A'), ('', 'Benlifer A'), ('', 'Korenblit J'), ('', 'Silberstein SD'), ('', 'Hattingh CJR')]

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

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

import re
string1 = '152: Ashkenazi A, Benlifer A, Korenblit J, Silberstein SD.'
string2 = '152: Ashkenazi A, Benlifer A, Korenblit J, Silberstein SD, Hattingh CJR.'
for i in [string1, string2]:
    print re.findall(r'^(\d+):', i)
    print re.findall(r'(?:[:,] )(\S+ [A-Z]+)(?=[\.,])', i)

производит

['152']
['Ashkenazi A', 'Benlifer A', 'Korenblit J', 'Silberstein SD']
['152']
['Ashkenazi A', 'Benlifer A', 'Korenblit J', 'Silberstein SD', 'Hattingh CJR']
0 голосов
/ 24 июля 2010

Если вы имеете в виду, что может быть больше (или меньше) имен, вам следует попробовать что-то вроде этого: (\d+): (.+)*? Звездочка (*) означает 0 или более вхождений (. +)

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