首页 > 解决方案 > 如何使用正则表达式提取多个字符串

问题描述

我是正则表达式的新手。有“(ENTITY A)-[:RELATION {}]->(ENTITY B)”格式的数据,例如,(Canberra)-[:capital_of {}]->(Australia)。如何提取两个实体和关系?

我尝试了以下代码:

path = "(Canberra)-[:capital_of {}]->(Australia)"
pattern = r'\(.*\)\-\[\:.*\]\-\>\(.*\)'
re.match(pattern,path).group()

但它与整个句子匹配。任何帮助,将不胜感激。

标签: pythonregex

解决方案


如果您不需要使用正则表达式,您可以使用

s="(Canberra)-[:capital_of {}]->(Australia)"
entityA = s[1:].split(')-')[0]
entityB = s.split('->(')[-1][:-1]

根据')-'子串的出现对输入串进行分割,取第一部分得到第一实体。

split()是在'->('子字符串的基础上完成的,并且选择最后一个拆分以获得第二个实体。

所以,

print(f'EntityA: {entityA}')
print(f'EntityB: {entityB}')

会给

EntityA: Canberra
EntityB: Australia

非正则表达式解决方案通常更快。

编辑:评论中要求的时间。

s="(Canberra)-[:capital_of {}]->(Australia)"
def regex_soln(s):
    pattern = r'\((.*)\)\-\[(:.*)\]\-\>\((.*)\)'
    rv = re.match(pattern,s).groups()
    return rv[0], rv[-1]

def non_regex_soln(s):
    return s[1:].split(')-')[0], s.split('->(')[-1][:-1]

%timeit regex_soln(s)
1.47 µs ± 60.8 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)


%timeit non_regex_soln(s)
619 ns ± 30.9 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

推荐阅读