可选年份分割字符串

时间:2015-11-11 18:35:24

标签: python regex

我试图在Python中使用RegEx来拆分一个以任何东西开头的字符串,可能会也可能不会以括号中的一年结束为两组,其中第一组应包含除年份之外的所有内容,第二组应包含只有一年,如果没有一年就没有。

这是我到目前为止所做的:

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解决方案。

2 个答案:

答案 0 :(得分: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

不需要正则表达式。只需检查它是否以括号中包含的四位数字结尾。如果是,请返回两个子串,并进行适当的拆分。如果没有,则返回整个字符串并且无。

或者,如果你坚持使用正则表达式,你可以做更多的事情:

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

模式检查包含在括号中的一年。它并不关心其他一切 - 我们只是给它年份子串,看它是否匹配。

答案 1 :(得分:0)

试试这个:(.*)\s*(?:\((\d{4,4})\))

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