使用正则表达式解析Python字符串

2 投票
3 回答
5961 浏览
提问于 2025-04-17 08:37

给定一个字符串 #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 #

撰写回答