代码之家  ›  专栏  ›  技术社区  ›  David J.

python 3.6返回的结果与预期不同

  •  2
  • David J.  · 技术社区  · 7 年前

    我想把绳子拔出来

    Triax PFG接口板:Inova:P/N 01-903510-02和Unity Plus: P/N 01-903510-03\r\n\r\n服务

    从以下方面:

    \ r\n \r\n建议\r\n无\r\n \r\n最大pfg接口板:Inova: P/N 01-903510-02和Unity Plus:P/N 01-903510-03\r\n\r\n服务 序列号:

    使用regex:

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

    当我在regex101上尝试时,这是正常的:

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

    但是当我在python 3.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
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Wiktor Stribiżew    7 年前

    您在在线测试仪上对字符串进行测试,而应该对字符串进行测试。

    这个

    '\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 -A 序列号 子字符串。