【问题标题】:Python: How to use regex to find a repetitive stringPython:如何使用正则表达式查找重复的字符串
【发布时间】:2019-07-16 14:18:05
【问题描述】:

当在数据块中找到关键字时,我想提取/输出一些数据。如何使用正则表达式检索从第一个 '#' 到最后一个 ')' 的所有数据?

//Log_1.txt
# DON'T WANT #
{12345.54321}
[Tues Jul 2 01:23:45 2019]
< SOME_TYPE 
(some_ID = [12345] reportChange::someMoreInfo called with invalid some ID)

# DON'T WANT #
{12345.54321}
[Tues Jul 2 01:23:45 2019]
< SOME_TYPE 
(some_ID = [12345] failed::someMoreInfo called with invalid some ID)

代码

import re

with open("Log_1.txt", 'r') as f:
    result = re.search('#(.*)#', f.read())

print(result.group(0))

这不是我的全部代码,但如果关键字是“reportChange”,输出应该是 >>>

# DON'T WANT #
  .
  .
  .
(some_ID = [12345] reportChange::someMoreInfo called with invalid some ID)

而不是

# DON'T WANT #

【问题讨论】:

  • 所以你想要DON'T WANT .... 似乎是一个不好的评论
  • 是的,我现在想要它,但最终不打算拥有它。 @depperm
  • 如果关键字是someMoreInfo,你想要整个日志还是只从最近的评论DON'T WANT
  • 是的,我想要关键字所在的整个数据块,并由空的新行 @depperm 分隔

标签: regex python-3.x recursion data-extraction


【解决方案1】:

假设您想要最新的# DON'T WANT #,您可以使用正则表达式#(.*)#[^)]+yourKeyWordHere[^)]+\)。在 python 中,您可以使用字符串格式并使用{} 代替关键字来替换您想要的任何单词。

import re

keyword='reportChange'

with open("Log_1.txt", 'r') as f:
    result = re.search('#(.*)#[^)]+{}[^)]+\)'.format(keyword), f.read())

print(result.group(0))

【讨论】:

  • 谢谢,该解决方案有效,但每次找到关键字时我都需要它来输出数据块。不只是第一个实例或最后一个实例。
【解决方案2】:

作为正则表达式,您必须使用否定的lookahead 和否定的lookbehind。

试试这个:(?!#).*(?&lt;![)]) 作为正则表达式。它应该输出 # 和 ) 之间的所有内容。

未来:使用regex101.com 测试您的正则表达式。

【讨论】:

    【解决方案3】:

    此代码仅打印存在reportChange::someMoreInfo called with invalid some ID 的数据块:

    data = '''//Log_1.txt
    # DON'T WANT #
    {12345.54321}
    [Tues Jul 2 01:23:45 2019]
    < SOME_TYPE
    (some_ID = [12345] reportChange::someMoreInfo called with invalid some ID)
    
    # DON'T WANT #
    {12345.54321}
    [Tues Jul 2 01:23:45 2019]
    < SOME_TYPE
    (some_ID = [12345] failed::someMoreInfo called with invalid some ID)
    
    # DON'T WANT #
    {12345.54321}
    [Tues Jul 2 01:23:45 2019]
    < SOME_TYPE
    (some_ID = [12345xxx] reportChange::someMoreInfo called with invalid some ID)
    '''
    
    import re
    
    for d in re.split(r'\n\n', data):
        g = re.findall(r'^# DON\'T WANT #.*reportChange::someMoreInfo called with invalid some ID\)$', d, flags=re.M|re.DOTALL)
        if g:
            print(g[0])
            print()
    

    打印:

    # DON'T WANT #
    {12345.54321}
    [Tues Jul 2 01:23:45 2019]
    < SOME_TYPE
    (some_ID = [12345] reportChange::someMoreInfo called with invalid some ID)
    
    # DON'T WANT #
    {12345.54321}
    [Tues Jul 2 01:23:45 2019]
    < SOME_TYPE
    (some_ID = [12345xxx] reportChange::someMoreInfo called with invalid some ID)
    

    【讨论】:

      猜你喜欢
      • 2021-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-16
      • 2022-06-15
      • 1970-01-01
      相关资源
      最近更新 更多