如何在匹配后和正则表达式中的关键字之前隐藏文本?

时间:2019-02-12 13:33:47

标签: python regex python-3.x

我想匹配所有用户评论,直到KEYWORD。另外,我也想跳过关键字前的最后一条评论之后的不重要的可变文本。

id  name   serial
1   aaa    1
2   bbb    2

我的结果不会跳过不重要的文本。

import re`

string = '''
COMMENTS:  
first comment /user_x  
second comment
two lines /user_y
Here is some unimportant text.  
KEYWORD:
Don't match comments or anything else after first keyword like this /user_x  
KEYWORD: <- again
Also ignore same keyword which could appear serveral times.
'''

我想要以下输出:

pattern = re.compile(r'(?<=COMMENTS:)(.+?/(user_x|user_y))+?(?:.+?)(?=KEYWORD:)', flags=re.DOTALL)
match = re.search(pattern, string).group(0)

print(match)

我在做什么错?非常感谢

1 个答案:

答案 0 :(得分:0)

您可以使用

pattern = re.compile(r'COMMENTS:\s*((?:(?:(?!KEYWORD:).)+?/(?:user_x|user_y))+).+?KEYWORD:', flags=re.DOTALL)
match = re.search(pattern, s)
if match:
    print(match.group(1))

输出不再包含不相关的行:

first comment /user_x  
second comment
two lines /user_y

请参见Python demo

详细信息

  • COMMENTS:-文字子字符串
  • \s*-超过0个空格
  • ((?:(?:(?!KEYWORD:).)+?/(?:user_x|user_y))+)-捕获组1(如果存在匹配项,match.group(1)将保留此值):重复一次或多次
    • (?:(?!KEYWORD:).)+?-不会开始KEYWORD:字符序列的任何一个或多个字符,但应尽可能少
    • /-一个/字符
    • (?:user_x|user_y)-user_xuser_x
  • .+?KEYWORD:-任意1个或多个字符后的KEYWORD:,并且尽可能少。

请参见regex demo