Python 正则表达式块中的正则表达式

Python 正则表达式块中的正则表达式,python,regex,Python,Regex,我一直在尝试解析块中的值 让我举例说明 我有以下案文: started xx xxxxxxx xxxxx xxxxxx xx xxxxxxxxx xxxxxxx xxxx xx xx xxx xxxxx xxxx xxxxxxxx xxxx xxxxxx found 9999 xxxxx xxxxx xxx xx xxxx xxxx xxxxxxxxxxx xxxxxxx xxx stored 9999 finished 我试图抓住“开始”和“完成”之间的价值 我试过这样的东西 (?<b

我一直在尝试解析块中的值

让我举例说明

我有以下案文:

started xx xxxxxxx xxxxx xxxxxx xx xxxxxxxxx xxxxxxx xxxx xx
xx xxx xxxxx xxxx xxxxxxxx xxxx xxxxxx found 9999 xxxxx xxxxx
xxx xx xxxx xxxx xxxxxxxxxxx xxxxxxx xxx stored 9999 finished
我试图抓住“开始”和“完成”之间的价值

我试过这样的东西

(?<block>started(.|\n)*finished)
(?开始(.\n)*完成)

但是我不知道如何在“存储”附近添加值
\d+

您提供的正则表达式不适用于Python
re
,因为
(?…)
不是受支持的命名组语法,它必须看起来像
(?p…)

此外,建议避免
(.|\n)*
这是一种非常低效的构造,请将
*?
re.DOTALL
/
re.S
(?)S
一起使用

如果需要在存储的
之后和完成的
之前捕获数字旁边的数字(如果这是可选的),请使用

详细信息

  • 已启动
    -左侧分隔符
  • (.*(?:存储的\s+(\d+)\s+)
    -Gropup 1:
    • *?
      -任何0+字符,尽可能少
    • (?:存储的\s+(\d+)\s+)
      -可选的组匹配
      • 已存储\s+
        -
        已存储
        和1+空格
      • (\d+)
        -第2组:一个或多个数字
      • \s+
        -1+空格
  • 已完成
    -右侧分隔符

这是否回答了您的问题?正则表达式不适用于Python
re
(?
必须是
(?P
)。不要使用
(.|\n)*
,使用
*?
re.DOTALL
。如果需要捕获数字,请尝试
re.findall(r'started(.*(?:stored\s++\d+\s+))finished',text,re.s+)
re.match(“started.+\d.”)(\d+)完成”,flags=re.DOTALL)
@IgorShilov与往常一样,
打开(文件+“.out.txt”,“w”)作为fw:fw.write(更新内容)
@IgorShilov我不知道你的意思。请将不工作的代码添加到问题中,并解释预期的行为。在我的情况下,如果我使用此代码,regex需要超过15 mb的当前日志文件,则它无法与open('log.log)一起工作,因为读取:——————————————————————————————————————————————————————————————————————————————————————(r'\d+.*07.*启动\s+\w+(*?(?:存储的\s+(\d+\s+))已完成。\w+,line,re.DOTALL)——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————“readlines()”或full-“read()”,我应该使用哪种方法以及在这种情况下如何编写正确的代码。请参阅:@IgorShilov您似乎正在使用Python2。除此之外,一切看起来都很好,
reading.read()
是正确的方法,因为它将所有文件内容读入单个变量。
re.findall(r'started(.*?(?:stored\s+(\d+)\s+)?)finished', text, re.S)