正则表达式匹配一行但不包括输出中的字符串

时间:2018-04-10 11:21:14

标签: python regex

我正在尝试解析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_]+)\(\+\)我能够提取第一组,但第二组似乎有一些问题。

任何建议都会非常有用

2 个答案:

答案 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'

希望这有帮助。