如何使用 RegEx 提取键之间的值?
Posted
技术标签:
【中文标题】如何使用 RegEx 提取键之间的值?【英文标题】:How to extract the value between the key using RegEx? 【发布时间】:2022-01-12 17:22:05 【问题描述】:我有这样的文字:
"abababba"
我想将字符提取为a
之间的列表。
对于上面的文本,我期望输出如下:
['b', 'b', 'bb']
我用过:
re.split(r'^a(.*?)a$', data)
但它不起作用。
【问题讨论】:
【参考方案1】:您可以使用 re.findall 以模式返回捕获组值:
a([^\sa]+)(?=a)
a
匹配 a
字符
([^\sa]+)
捕获组 1,重复匹配除 a
之外的任何字符(如果您不想匹配空格,则为 whitspace 字符)
(?=a)
正向前瞻,向右断言 a
Regex demo
import re
pattern = r"a([^\sa]+)(?=a)"
s = "abababba"
print(re.findall(pattern, s))
输出
['b', 'b', 'bb']
【讨论】:
【参考方案2】:您可以使用列表推导来实现此目的:
s = "abababba"
l = [x for x in s.split("a") if not x == ""]
print(l)
输出:
['b', 'b', 'bb']
【讨论】:
【参考方案3】:^ 和 $ 将仅分别匹配行的开头和结尾。 在这种情况下,您将使用以下行获得所需的列表:
re.split(r'a(.*?)a', data)[1:-1]
【讨论】:
【参考方案4】:为什么不使用正常的拆分:
"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']
【讨论】:
以上是关于如何使用 RegEx 提取键之间的值?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 .NET C# regex 或其他任何方法提取 *>...* 之间的文本字符串?