我正在尝试解析SQL查询连接条件。我需要提取包含(+)
的折线,并根据提取对其进行分组。我使用的是python 3.6
以下是我的测试字符串:
1. a.deptno = b.dept_no(+)
2. c.deptno(+)=b.dept_no
3. a.deptno(+)= 900
首先:我需要提取
(+)
秒的行:需要 提取别名,例如
1. a , b
2. c , b
3. a
直到现在我已经尝试了regex
使用([\w_]+).*?([\w_]+)\(\+\)
我能够提取第一组,但第二组似乎有一些问题。
任何建议都会非常有用
答案 0 :(得分:1)
您可以使用positive lookahead (?=
断言该字符串包含(+)
。
然后,您可以匹配捕获组中的值。
^(?=.*\(\+\))(\w+)\.[^=]+=\s*(?:(\w+)\.)?.*$
匹配:
^
行的开头(?=.*\(\+\))
肯定前面的内容包含(+)
(\w+)\.
在一个组中捕获一个或多个单词字符(组1 ),后跟一个点[^=]+
匹配NOT = =符号一次或多次=\s*
匹配一个=符号,然后匹配零个或多个空白字符(?:
非捕获组
(\w+)\.
在一个组中捕获一个或多个单词字符(组2 ),后跟一个点)?
关闭非捕获组并将其设为可选.*$
匹配任何字符零次或多次,直至行$
答案 1 :(得分:0)
pattern = r'([a-z]+)\.[a-z]+\_?[a-z]+\(\+\)'
In [24]: s = 'a.deptno = b.dept_no(+)'
In [25]: re.search(pattern, s).group(1)
Out[25]: 'b'
In [26]: s = "c.deptno(+)=b.dept_no"
In [27]: re.search(pattern, s).group(1)
Out[27]: 'c'
In [28]: s = "a.deptno(+)= 900"
In [29]: re.search(pattern, s).group(1)
Out[29]: 'a'
希望这有帮助。