2015-11-11 3 views
0

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

Это то, что я до сих пор:

string1 = 'First string' 
string2 = 'Second string (2013)' 

p = re.compile('(.*)\s*(?:\((\d{4,4})\))?') 

print(p.match(string1).groups()) 
print(p.match(string2).groups()) 

, который возвращает код это:

('First string', None) 
('Second string (2013)', None) 

Но я пытаюсь получить это:

('First string', None) 
('Second string', '2013') 

Я понимаю, что первая часть моего RegEx жадна, но я не могу найти способ сделать ее не жадным, не имея ничего общего. Кроме того, первая часть моей строки может содержать больше или меньше всего (включая круглые скобки и числа).

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

+1

[* Некоторые люди, столкнувшись с проблемой, думают: «Я знаю, я буду использовать регулярные выражения». Теперь у них есть две проблемы. *] (Http://regex.info/blog/2006-09-15/247) - [Джейми Завински] (https://en.wikipedia.org/wiki/Jamie_Zawinski) –

+0

Возможный дубликат из [Как я могу опционально совместить дополнительную подстроку с регулярными выражениями Python?] (http://stackoverflow.com/questions/17936594/how-do-i-optionally-match-an-additional-substring-with-python -regular -expression) –

+0

Я думаю, что ваше обучение ошибочно. Вы должны научиться использовать регулярное выражение для вещей, которые упрощаются с помощью регулярных выражений. Регулярное выражение не упрощается. С помощью регулярных выражений в Python почти ничего не получается. – ArtOfWarfare

ответ

1

Вот простой метод, который делает то, что вы хотите:

def extractYear(s): 
    if len(s) >= 6 and s[-6] == '(' and s[-5:-1].isdigit() and s[-1] == ')': 
     return s[:-6], s[-6:] 
    return s, None 

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

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

def extractYear(s): 
    if len(s) >= 6: 
     year = s[-6:] 
     p = re.compile('\(\d{4,4}\)') 
     if p.match(year): 
      return s[:-6], s[-6:] 
    return s, None 

Шаблон проверки в течение года, завернутые в круглых скобках. Это не заботится обо всем остальном - мы просто даем ему подстроку года, чтобы увидеть, совпадает ли это или нет.

+0

В итоге я использовал что-то вроде этого. Спасибо! –

0

Попробуйте это: (.*)\s*(?:\((\d{4,4})\))

>>> string2 = "Second String (2013)" 
>>> p = re.compile("(.*)\s*(?:\((\d{4,4})\))") 
>>> p.match(string2).groups() 
('Second String ', '2013') 
+0

Это не работает в первой строке, давая мне ошибку 'AttributeError: объект NoneType 'не имеет атрибутов' groups'' –

+0

Работает для меня, добавлен рабочий код тоже –

+0

Он работает для' string2', но он не работает для 'string1' , –

Смежные вопросы