python - 如何使用正则表达式提取多个字符串
问题描述
我是正则表达式的新手。有“(ENTITY A)-[:RELATION {}]->(ENTITY B)”格式的数据,例如,(Canberra)-[:capital_of {}]->(Australia)。如何提取两个实体和关系?
我尝试了以下代码:
path = "(Canberra)-[:capital_of {}]->(Australia)"
pattern = r'\(.*\)\-\[\:.*\]\-\>\(.*\)'
re.match(pattern,path).group()
但它与整个句子匹配。任何帮助,将不胜感激。
解决方案
如果您不需要使用正则表达式,您可以使用
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)
推荐阅读
- python - 我遇到了 tkinter def 无法启动的问题
- vim - 如何在 Windows 10 系统中使用 gitbash 在 Vim 中包含格式化的 Epitech 标准标头?
- sqlite - 如果表没有主键怎么办
- python - 如何在数据中添加随机白噪声
- c++ - 课堂上的一条线,使整个应用程序崩溃。0xC000005 错误
- javascript - 有没有办法使用 Google Apps 脚本中的 ICU/Intl/v8BreakIterator 遍历文档中的单词?
- c# - 如何在 WPF 的 Xceed PropertyGrid 中隐藏子属性?
- javascript - jquery onclick 不适用于 .load() 函数中的元素
- python - ValueError:以 10 为基数的 int 的无效文字:''
- csv - 如何使用 perl 从 csv 文件中提取行数据?