【问题标题】:Searching for specific files using regex使用正则表达式搜索特定文件
【发布时间】:2016-12-20 12:12:54
【问题描述】:

我正在尝试在文件夹中的文件名中捕获两个特定的单词/字符序列。到目前为止,我在https://regex101.com/ 上给出了正确的输出,但在我正在使用的脚本中却没有。

这是我正在使用的文件名类型:

Bjørn Stallaresvei s 10013.pdf

或

Københavngaten 1 L. 8.pdf

这是我目前想出的正则表达式:

((?<=\s)[a-zA-Z\.]+(?=[\s0-9]+\.pdf))|((?<=\s)[0-9]+(?=.pdf))

我试图在第一行捕获“s”和“10013” - 其中“s”是标识符,10013 是 ID。

第二行也一样,L.是标识符,8是ID。

这只是一个示例代码:

import re

string_1 = "Stallaresvei s 10013.pdf"

regexp = r"(((?<=\s)[a-zA-Z\.]+(?=[\s0-9]+\.pdf))|((?<=\s)[0-9]+(?=.pdf)))"
m = re.search(regexp, string_1)

print(m)

并且输出只显示找到的一个匹配项:

<_sre.SRE_Match object; span=(13, 14), match='s'>

【问题讨论】:

    标签: python regex python-3.x


    【解决方案1】:

    您可以删除捕获括号并将您的正则表达式与re.findall 一起使用:

    r'(?<=\s)[a-zA-Z.]+(?=[\s0-9]+\.pdf)|(?<=\s)[0-9]+(?=\.pdf)'
    

    见online Python 3 demo:

    import re
    string_1 = "Stallaresvei s 10013.pdf"
    regexp = r"(?<=\s)[a-zA-Z.]+(?=[\s0-9]+\.pdf)|(?<=\s)[0-9]+(?=\.pdf)"
    m = re.findall(regexp, string_1)
    print(m) # => ['s', '10013']
    

    另一种方法是重写模式并将这些位捕获分成两组,参见another demo:

    import re
    string_1 = "Stallaresvei s 10013.pdf"
    regexp = r"\s([a-zA-Z.]+)\s+([0-9]+)\.pdf"
    m = re.search(regexp, string_1)
    if m:
        print([m.group(1), m.group(2)])
    

    这里,

    • \s - 匹配空格
    • ([a-zA-Z.]+) - 捕获组 1 匹配 1+ ASCII 字母或 .
    • \s+ - 1+ 个空格
    • ([0-9]+) - 捕获组 2 匹配 1+ ASCII 数字
    • \.pdf - 只匹配 .pdf 子字符串。

    【讨论】:

    • 我是如此接近 :) 谢谢你!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    相关资源
    最近更新 更多