“未获得预期结果”;或;python正则表达式中的字符

“未获得预期结果”;或;python正则表达式中的字符,python,regex,Python,Regex,我试图匹配一些相当简单的文本,但在使用“|”字符时遇到了问题。案文如下: “TF0876一些文本Y-2.31-0.01\N TF9788更多文本Y-2.3-\N TF1626” 我想使用re.findall提取两项: “TF0876 Y N 2.31的一些文本”和 “TF9788更多文本Y-” 我认为可行的代码是: mat = re.compile(r"TF\d{4}.*?[Y|N] [Y|N] [-|\d\.\d*]",flags=re.DOTALL) test2 = re.findall(m

我试图匹配一些相当简单的文本,但在使用“|”字符时遇到了问题。案文如下:

“TF0876一些文本Y-2.31-0.01\N TF9788更多文本Y-2.3-\N TF1626”

我想使用re.findall提取两项:

“TF0876 Y N 2.31的一些文本”
“TF9788更多文本Y-”

我认为可行的代码是:

mat = re.compile(r"TF\d{4}.*?[Y|N] [Y|N] [-|\d\.\d*]",flags=re.DOTALL)
test2 = re.findall(mat,text)
print(test2)
但是,这给了我以下列表:

['TF0876 some text for  Y N 2', 'TF9788 more text N Y -']
出于某种原因,在正则表达式找到的第一个匹配中,停止在“2”,而不是我想要的“2.31”。如果我只是输入
2.31
而不是
\d\.\d*
,那么它仍然只匹配到“2”。事实上,无论我键入什么,我似乎只从“|”的两边得到一个字符。我不明白这一点;正则表达式HOWTO表示表达式
Crow | Servo
将匹配“Crow”或“Servo”,但不会更小(如“Cro”)。在我的情况下,相反的情况似乎正在发生,因此我显然不明白一些事情,并将感谢您的帮助


谢谢。

问题是您使用括号
[]
而不是括号
()
来分隔子组。试试这个:

import re

text = "TF0876 some text Y N 2.31 - 0.01\n TF9788 more text N Y - 2.3 -\n TF1626"
mat = re.compile(r"TF\d{4}.*?(?:Y|N) (?:Y|N) (?:-|\d\.\d*)",flags=re.DOTALL)
test2 = re.findall(mat, text)
print(test2)
# ['TF0876 some text Y N 2.31', 'TF9788 more text N Y -']

这里的
?:
位只是为了不捕获子组。请注意,
(?:Y | N)
基本上与简单的
[YN]
问题在于编译的语句,请尝试将其更改为

mat = re.compile(r"TF\d{4}.*?[YN] [YN] [-\d\.]*",flags=re.DOTALL)
您将不需要“[]”中的“|”。这些括号已经表示不同可能表达式的范围或集合

第二种选择是通过应用“()”括号而不是“[]”来使用组。取决于您想要精确匹配的内容。这两种方法都适用于给定的示例文本