我有这样的文本:
"abababba"
我想提取字符作为a
之间的列表。对于上面的文本,我希望输出如下:
['b', 'b', 'bb']
我使用过:
re.split(r'^a(.*?)a$', data)
但它不起作用。
您可以使用re.findall返回模式为的捕获组值
a([^sa]+)(?=a)
a
匹配a
字符([^sa]+)
捕获组1,重复匹配除a
之外的任何字符(如果不想匹配空格,则为whitspace字符((?=a)
正向前瞻,向右断言a
Regex演示
import re
pattern = r"a([^sa]+)(?=a)"
s = "abababba"
print(re.findall(pattern, s))
输出
['b', 'b', 'bb']
您可以使用列表理解来实现这一点:
s = "abababba"
l = [x for x in s.split("a") if not x == ""]
print(l)
输出:
['b', 'b', 'bb']
^和$将分别只匹配一行的开头和结尾。在这种情况下,您将使用以下行获得所需的列表:
re.split(r'a(.*?)a', data)[1:-1]
为什么不使用正常拆分:
"abababba".split("a") --> ['', 'b', 'b', 'bb', '']
并根据需要移除空部件:
# remove all empties:
[*filter(None,"abababba".split("a"))] -> ['b', 'b', 'bb']
或
# only leading/trailing empties (if any)
"abababba".strip("a").split("a") --> ['b', 'b', 'bb']
或
# only leading/trailing empties (assuming always enclosed in 'a')
"abababba".split("a")[1:-1] --> ['b', 'b', 'bb']
如果你必须使用正则表达式,也许findall((可以让你使用一个更简单的模式,同时覆盖所有的边缘情况(忽略所有的空(:
re.findall(r"[^a]+","abababba") --> ['b', 'b', 'bb']
re.findall(r"[^a]+","abababb") --> ['b', 'b', 'bb']
re.findall(r"[^a]+","bababb") --> ['b', 'b', 'bb']
re.findall(r"[^a]+","babaabb") --> ['b', 'b', 'bb']