Python RegEx在各种条件下匹配子串

时间:2015-03-05 14:09:03

标签: python regex

现在已经挣扎了一段时间了 - 我根本无法绕过它。

鉴于以下字符串变体:

some text
some text http://a.link.to/something
some text - http://a.link.to/something
some text: http://a.link.to/something
http://a.link.to/something

我正在寻找能产生以下效果的RegEx:

{'text': 'some text',
 'link': ''}

{'text': 'some text',
 'link': 'http://a.link.to/something'}

{'text': '',
 'link': 'http://a.link.to/something'}

干杯!

2 个答案:

答案 0 :(得分:3)

在re.match函数中使用命名捕获组,以便您可以使用用户定义的键创建字典。

>>> s = '''some text
some text http://a.link.to/something
some text - http://a.link.to/something
some text: http://a.link.to/something
http://a.link.to/something'''
>>> for i in s.split('\n'):
        re.match(r'(?P<text>(?:(?!http://).)*?)\W*\b(?P<link>http://.*)?$', i).groupdict()


{'link': None, 'text': 'some text'}
{'link': 'http://a.link.to/something', 'text': 'some text'}
{'link': 'http://a.link.to/something', 'text': 'some text'}
{'link': 'http://a.link.to/something', 'text': 'some text'}
{'link': 'http://a.link.to/something', 'text': ''}

答案 1 :(得分:1)

你可以使用这样的正则表达式:

(.+?)(http.*)?$

<强> Working demo

enter image description here

正如你所看到的那样,并没有完全实现你想要的情况:

some text - http://a.link.to/something

因为它产生:

{'text': 'some text - ',  'link': 'http://a.link.to/something'}
                    ^--- Dash here

但你可以对文字进行预先或后期清理。

我发布了答案,因为它可能对你有帮助。