如何使用正则表达式提取键之间的值?

How to extract the value between the key using RegEx?

我有这样的文字:

"abababba"

我想将字符提取为 a 之间的列表。 对于上面的文本,我期望输出如下:

['b', 'b', 'bb']

我用过:

re.split(r'^a(.*?)a$', data)

但是没用。

您可以使用 re.findall 到 return 具有以下模式的捕获组值:

a([^\sa]+)(?=a)
  • a 匹配一个 a 字符
  • ([^\sa]+) 捕获第 1 组,重复匹配除 a 之外的任何字符(如果不想匹配空格,则为空白字符)
  • (?=a) 正面前瞻,向右断言 a

Regex demo

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']