【问题标题】:getting a certain group from regex match从正则表达式匹配中获取某个组
【发布时间】:2020-04-11 22:40:46
【问题描述】:

我有一个带有一些文本的 .txt 文件(从 edifact 文件复制),我想匹配某些字段,我基本上只想要日期(匹配 1,组 0)

这是我拥有的正则表达式 https://regex101.com/r/oSVlS8/6

但我无法在我的代码中实现它,我只想要匹配的第 0 组。

这是我的代码:

regex = r"^((?:INV)\+(?:[^+\n]*\+){4})\d{8}"
with open ("test edifakt 1 bk v1.txt", "r") as f:
    result = re.findall(regex,f.read(),re.MULTILINE)
    print(result)

这就是我得到的结果:

['INV+ED Format 1+Brustkrebs+19880117+E000000001+']

我实际上想要“20080702”

我尝试了print(result.group(0)) 之类的方法,但没有奏效。我得到了:
AttributeError: 'list' object has no attribute 'group'

我也尝试将它作为这样的论点 result = re.findall(regex,f.read(),group(0),re.MULTILINE) 但我得到
get NameError: name 'group' is not defined

如果我使用re.search 及其字符串,我真的只能匹配某个组吗?

【问题讨论】:

  • 尝试切换组\bINV\+(?:[^+\n]*\+){4}(\d{8})regex101.com/r/i5MedI/1,值将在组1中
  • re.findall() returns a list,所以,如果您想要第一场小组赛,请使用re.findall()[0]

标签: python regex match


【解决方案1】:

您可以更改捕获组以捕获数字。

注意您可以省略 INV (?:INV) 周围的非捕获组并使用 * 作为 [^+\n]*\+ 的量词也可能匹配 4 个连续的加号 ++++

^INV\+(?:[^+\n]*\+){4}(\d{8})
  • ^ 字符串开始
  • INV\+匹配INV+
  • (?:非捕获组
    • [^+\n]*\+ 匹配除 + 或换行符以外的任何字符 0+ 次
  • ){4}关闭小组并重复4次
  • (\d{8})捕获组1,匹配8位

Regex demo | Python demo

例如

regex = r"^INV\+(?:[^+\n]*\+){4}(\d{8})"
result = re.findall(regex, test_str, re.MULTILINE)
print(result)

输出

['20080702']

如果你想使用分组方法,你可以使用

matches = re.search(regex, test_str, re.MULTILINE) 
if matches:
    print(matches.group(1))

输出

20080702

Python demo


【讨论】:

  • 答案是对的,但是从OP上的描述来看,用户仍然会遇到麻烦,因为他想要字符串。他正在寻找result[0] 而不是简单的result。 :-)
  • @accdias 感谢您的评论。我添加了另一个使用 re.search 的示例
  • 谢谢!我没想过要更改表达式本身,这很有效:D,我想继续使用 re.findall 函数而不是搜索,所以谢谢!
【解决方案2】:

试试这个正则表达式

re.search(r'(?:INV)\+(?:[^+\n]*\+){4}(\d{8})', text).group(1)

返回

'20080702'

【讨论】:

  • 谢谢你,这行得通,但我拥有的是文件对象而不是字符串,是唯一的方法吗?
  • 不,只需将result = re.findall(regex,f.read(),re.MULTILINE) 中的正则表达式替换为我给您的正则表达式
  • 我试过了,它没有用,我认为这是因为我有一个文件对象,而不是一个字符串,所以当我尝试它时,我得到了 NameError: name 'text' is not defined
  • 当我将内容粘贴到字符串“文本”中时,这确实有效,所以我赞成^^
猜你喜欢
  • 2021-03-29
  • 1970-01-01
  • 1970-01-01
  • 2015-03-10
  • 1970-01-01
  • 2016-03-12
  • 1970-01-01
  • 1970-01-01
  • 2013-09-18
相关资源
最近更新 更多