Python3.6返回的结果与预期不同

2024-07-04 05:14:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在试着提取字符串

Triax PFG Interface Boards: Inova: P/N 01-903510-02 and Unity plus: P/N 01-903510-03\r\n\r\nService

从以下方面:

\r\n\r\nSupersedes\r\nNone\r\n\r\nTriax PFG Interface Boards: Inova: P/N 01-903510-02 and Unity plus: P/N 01-903510-03\r\n\r\nService Serial Numbers:\r\nUS00000000-US99999999\r\n\r\n

使用正则表达式:

Supersedes:?[\\r\\n ]+[\w\-\s]+[\\r\\n ]+(.*)[\\r\\n ]+Serial Numbers?:?[ \\r\\n]+.*?

当我在regex101上试用它时,这与预期一样有效:

https://regex101.com/r/eHdhBV/1/

但当我在Python3.6中尝试这一点时,第一个匹配的组并不是我所期望的:

import re
result = re.search('Supersedes:?[\\r\\n ]+[\w\-\s]+[\\r\\n ]+(.*)[\\r\\n ]+Serial Numbers?:?[ \\r\\n]+.*?', '\r\n\r\nSupersedes\r\nNone\r\n\r\nTriax PFG Interface Boards: Inova: P/N 01-903510-02 and Unity plus: P/N 01-903510-03\r\n\r\nService Serial Numbers:\r\nUS00000000-US99999999\r\n\r\n', re.S|re.M)
result[1]
'Boards: Inova: P/N 01-903510-02 and Unity plus: P/N 01-903510-03\r\n\r\nService'

为什么Python遗漏了“Triax PFG接口”?你知道吗

编辑:

正如我所建议的,我也尝试了使用字符串文字。结果如下:

rx = r'Supersedes:?[\\r\\n ]+[\w\-\s]+[\\r\\n ]+(.*)[\\r\\n ]+Serial Numbers?:?[ \\r\\n]+.*?'
result = re.search(rx, '\r\n\r\nSupersedes\r\nNone\r\n\r\nTriax PFG Interface Boards: Inova: P/N 01-903510-02 and Unity plus: P/N 01-903510-03\r\n\r\nService Serial Numbers:\r\nUS00000000-US99999999\r\n\r\n', re.S|re.M)
result[1]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not subscriptable

Tags: andreserialplusunityresultinterfacenumbers
1条回答
网友
1楼 · 发布于 2024-07-04 05:14:42

您在联机测试仪上测试的是字符串文本,而您应该测试的是文本字符串。你知道吗

那个

'\r\n\r\nSupersedes\r\nNone\r\n\r\nTriax PFG Interface Boards: Inova: P/N 01-903510-02 and Unity plus: P/N 01-903510-03\r\n\r\nService Serial Numbers:\r\nUS00000000-US99999999\r\n\r\n'

是字符串文本,其中的\r\n转义序列,由Python字符串引擎分别更改为CR和LF符号。你知道吗

字符串文本表示以下文本字符串

Supersedes
None

Triax PFG Interface Boards: Inova: P/N 01-903510-02 and Unity plus: P/N 01-903510-03

Service Serial Numbers:
US00000000-US99999999

开头和结尾有两行空行。见the actual regex demo online。你知道吗

你可以用

import re
s = '\r\n\r\nSupersedes\r\nNone\r\n\r\nTriax PFG Interface Boards: Inova: P/N 01-903510-02 and Unity plus: P/N 01-903510-03\r\n\r\nService Serial Numbers:\r\nUS00000000-US99999999\r\n\r\n'
m = re.search(r'Supersedes:?\s+[\w -]+\s+(.*)\sSerial Number', s, re.S)
if m:
    print(m.group(1))

参见Python demo

细节

  • Supersedes:?-Supersedes:Supersedes子串
  • \s+-1+空格(包括垂直空格,即换行符)
  • [\w -]+-1+字、空格和/或连字符
  • \s+-1+空格
  • (.*)-任何0+个字符(由于re.S标志,也包括换行符)尽可能多(如果需要多于1个匹配项,则将*替换为*?以使其匹配尽可能少的字符)
  • \s-空白
  • Serial Number-一个Serial Number子串。你知道吗

相关问题 更多 >

    热门问题