我有一个.txt文件,其中包含一些文本(从edifact文件复制),我想匹配某些字段,我基本上只想要日期(匹配1,组0)
这是我拥有的正则表达式 https://regex101.com/r/oSVlS8/6
但是我不能在我的代码中实现它,我只想要匹配的组0。
这是我的代码:
My fixture
这就是我得到的结果:
http://www.example.com/
我实际上想要的是“ 20080702”
我尝试了类似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+']
我也尝试将其作为类似print(result.group(0))
的参数,但得到
AttributeError: 'list' object has no attribute 'group'
如果我使用result = re.findall(regex,f.read(),group(0),re.MULTILINE)
及其字符串,我真的只能匹配某个组吗?
答案 0 :(得分:2)
尝试此正则表达式
re.search(r'(?:INV)\+(?:[^+\n]*\+){4}(\d{8})', text).group(1)
返回
'20080702'
答案 1 :(得分:2)
您可以更改捕获组以捕获数字。
请注意,您可以省略INV (?:INV)
周围的非捕获组,并使用*
作为[^+\n]*\+
的量词也可以匹配4个连续的加号++++
^INV\+(?:[^+\n]*\+){4}(\d{8})
^
字符串的开头INV\+
匹配INV + (?:
非捕获组
[^+\n]*\+
匹配0+次除+
或换行符以外的任何字符){4}
关闭小组并重复4次(\d{8})
捕获第1组,匹配8位数字例如
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