使用正则表达式解析Python字符串
给定一个字符串 #abcde#jfdkjfd
,我该如何获取两个 #
之间的内容呢?另外,我还希望如果没有成对的 #
(也就是说没有 #
或者只有一个 #
),这个函数会返回 None
。
3 个回答
1
如果你不想使用复杂的正则表达式,并且愿意在没有结果的情况下接受一个空列表,而不是返回None
,那么有个简单的方法:
>>> "#abcde#jfdkjfd".split('#')[1:-1]
['abcde']
注意,结果必须是一个列表,因为可能会有多个结果。
如果你坚持想要在没有结果时返回None
(虽然这样做并不完美,因为这也会把任何空字符串变成None
):
>>> "#abcde#jfdkjfd".split('#')[1:-1] or None
['abcde']
如果你只想要第一个匹配的字符串,你可以这样做:
>>> def first_marked(s):
token = s.split('#')
if len(token) >= 3:
return token[1]
else:
return None
>>> first_marked("#abcde#jfdkjfd")
'abcde'
2
使用 (?<=#)(\w+)(?=#)
这个表达式,并捕获第一个分组。你甚至可以在一个包含多个嵌套字符串的字符串中循环使用它,它也能正常工作。
这个表达式同时使用了正向回顾和正向前瞻的技巧。
9
>>> import re
>>> s = "abc#def#ghi#jkl"
>>> re.findall(r"(?<=#)[^#]+(?=#)", s)
['def', 'ghi']
解释:
(?<=#) # Assert that the previous character is a #
[^#]+ # Match 1 or more non-# characters
(?=#) # Assert that the next character is a #