“未获得预期结果”;或;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)
您将不需要“[]”中的“|”。这些括号已经表示不同可能表达式的范围或集合
第二种选择是通过应用“()”括号而不是“[]”来使用组。取决于您想要精确匹配的内容。这两种方法都适用于给定的示例文本