我有以下字符串
[(net, asset), (amount, asset), (connect, asset), (net, asset), (check, asset), (service, asset), (adapt, asset)] | [(part, asset)]
我只想提取开括号后面的第一个单词。我的输出应该是-
net amount connect net check service adapt part
数据
[(net, asset), (amount, asset), (connect, asset), (net, asset), (check, asset), (service, asset), (adapt, asset)] | [(part, asset)]
我尝试了以下方法。
p=re.compile("'('(.*)','")
result = p.search(data)
result.group(1)
但是这种模式匹配不起作用。任何帮助请
答案 0 :(得分:1)
这里的正则表达式分析:https://regex101.com/r/kAXpNA/1。
re.findall('\((.*?),', '[(net, asset), (amount, asset), (connect, asset), (net, asset), (check, asset), (service, asset), (adapt, asset)] | [(part, asset)]')
#['net', 'amount', 'connect', 'net', 'check', 'service', 'adapt', 'part']
答案 1 :(得分:0)
您当前的模式有几个问题:
p=re.compile("'('(.*)','")
(
和)
是用于创建regex groups的正则表达式中的特殊字符。要从字面上匹配括号,您需要执行\(
。.*
也可以匹配任何字符,而正则表达式最终将尝试匹配尽可能多的字符,这意味着它将跨越字符串中的多对字符。 (就像"(net, asset), (amount, asset), (connect,"
这样的东西实际上满足了这种模式)如果您知道要查找的元素都是单词char,就像您在示例中一样,则可以尝试使用\w*
。 最后search
仅查找它遇到的第一个匹配项。相反,您想使用findall
来获取字符串中模式的每个实例。因此结果将是:
p=re.compile("\((\w*),")
result = p.findall(data)
result
# ['net', 'amount', 'connect', 'net', 'check', 'service', 'adapt', 'part']
答案 2 :(得分:0)
将代码更改为:
p = re.compile(r'\((\w+),')
result = p.search(data)
result.group(1)
或者,如果您想在(
之后加上所有首字母,请输入:
[ m.group(1) for m in re.finditer(p, data)]
答案 3 :(得分:0)
您的模式尝试匹配示例数据中不存在的单引号,并且您必须转义右括号以使其在字面上匹配。
.*
是贪婪的,它将首先匹配到字符串的末尾,然后回溯匹配最后一个逗号以实现整个模式。您可以将其变成惰性量词.+?
,然后使用加号将其匹配1次以上。
如果您想匹配的不只是单词字符,而且又不想匹配逗号的左括号,则获取匹配项的另一种方法是使用否定的字符类:
\(([^,(]+)
说明
\(
从字面上匹配(
(
开始捕获组
[^,(]+
否定的字符类,匹配1次以上而不是,
或(
)
关闭捕获组例如
import re
regex = r"\(([^,(]+)"
data = "[(net, asset), (amount, asset), (connect, asset), (net, asset), (check, asset), (service, asset), (adapt, asset)] | [(part, asset)]"
print(re.findall(regex, data))
# ['net', 'amount', 'connect', 'net', 'check', 'service', 'adapt', 'part']