【问题标题】:Regex first occurrence of string search gives NULL output正则表达式第一次出现字符串搜索给出 NULL 输出
【发布时间】:2021-08-17 14:08:47
【问题描述】:

我是 regex 和 python 的新手,我必须从文本文件中找到第一次出现的字符串。并且在找到第一次出现的字符串后需要找出驻留在传递字符串的字符串。我只需要将第一个结果存储在变量中。

文本文件如下所示:

Media Attribute (a): rtpmap:97 AMR/8000

Media Attribute (a): fmtp:97 mode-set=0,2,4,7; mode-change-period=2; mode-change-capability=2; mode-change-neighbor=1; max-re...

Media Attribute (a): rtpmap:100 telephone-event/8000

我需要的输出是从第一次出现的“Media Attribute (a):”中获取“rtpmap:97 AMR/800”作为字符串。

我执行了以下代码,但输出为空

import re
with open('codecc.txt') as f:
    for line in f:
        codecc_search = re.search(r'Media Attribute (a): (\s+) (\s+)', f.read())
        if (codecc_search):
            codecc = codecc_search.group(1)
            codecc = str(codecc)
            print(f"Codecc={codecc}")

非常感谢任何帮助。提前致谢

【问题讨论】:

  • 转义特殊的正则表达式元字符。在这里,() 是特殊的,需要转义。此外,要匹配任何非空格,请使用\S,而不是\s
  • codecc_search = re.search(r'Media Attribute (a): (\S+) (\S+)', f.read())
  • 更新上面的评论仍然是NULL结果
  • 不,我的意思是r'Media Attribute \(a\): (\S+) (\S+)',您没有转义特殊的括号,请参阅regex101.com/r/oe0B15/1
  • 可能是因为我传入re.search的字符串

标签: python-3.x regex text regex-group


【解决方案1】:

你需要使用

import re
with open('codecc.txt', 'r') as f:
    codecc_search = re.search(r'Media Attribute\s*\(a\):\s*(\S+\s+\S+)', f.read())
    if codecc_search:
        codecc = codecc_search.group(1)
        print(f"Codecc={codecc}")

请参阅regex demo正则表达式详细信息

  • Media Attribute - 固定字符串
  • \s* - 零个或多个空格
  • \(a\): - (a): 字符串
  • \s* - 零个或多个空格
  • (\S+\s+\S+) - 第 1 组:一个或多个非空格、一个或多个空格和一个或多个非空格。

f.read() 部分将文件内容读入单个字符串变量,re.search 仅查找第一个匹配项,codecc_search.group(1) 获取第 1 组值。

【讨论】:

  • 非常感谢。你总是一个快乐的解释者。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-26
  • 2016-09-28
  • 2011-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多