【问题标题】:extract a pattern from different string in Python从 Python 中的不同字符串中提取模式
【发布时间】:2016-08-12 08:44:58
【问题描述】:

我的文件名很少:

xyz-1.23.35.10.2.rpm

xyz-linux-version-90.12.13.689.tar.gz

xyz-xyz-xyz-13.23.789.0-xyz-xyz.rpm

这里的xyz可以是任意大小的任意字符串(只有字母没有数字)

这里带('.')的数字是每个文件的版本。

我可以使用一个通用函数从每个文件名中提取版本吗? 我试过了,但是这个函数变得太大了,并且大量使用了硬编码常量。 请推荐一个简单的方法

【问题讨论】:

    标签: python string split pattern-matching substring


    【解决方案1】:

    我们可以使用re 模块来做到这一点。让我们定义我们要匹配的模式。

    我们需要匹配一串数字:

    \d+
    

    这些数字后面可以跟一个句点或连字符:

    \d+[\-\.]?
    

    而且这种模式可以重复多次:

    (\d[\-\.]?)*
    

    最后,我们总是以至少一位数字结尾:

    (\d+[\-\.]?)*\d+
    

    此模式可用于定义从文件名返回版本号的函数:

    import re
    
    def version_from(filename, pattern=r'(\d+[\-\.]?)*\d+'):
        match = re.search(pattern, filename)
        if match:
            return match.group(0)
        else:
            return None
    

    现在我们可以使用该函数从您提供的数据中提取所有版本:

    data = ['xyz-1.23.35.10.2.rpm', 'xyz-linux-version-90-12-13-689.tar.gz', 'xyz-xyz-xyz-13.23.789.0-xyz-xyz.rpm']
    
    versions = [version_from(filename) for filename in data]
    

    结果就是你要的列表:

    ['1.23.35.10.2', '90-12-13-689', '13.23.789.0']
    

    【讨论】:

    • 完美。惊人的。我爱你 。它解决了我的问题
    • @AshishKumar 很高兴为您提供帮助。我注意到您的问题已更改为从要求中排除连字符。如果这是正确的,您的模式只需要 r'(\d+\.?)\d+'
    【解决方案2】:

    不确定是否有更好的方法正则表达式不是我真正喜欢的,但这里有一种方法可以让您查看文件的版本,假设唯一出现的数字是这种格式的版本。

    import re
    strings = [
        "xyz-1.23.35.10.2.rpm",
        "xyz-linux-version-90.12.13.689.tar.gz",
        "xyz-xyz-xyz-13.23.789.0-xyz-xyz.rpm",
    ]
    for string in strings:
        matches = re.findall("\d+", string)
        version = ".".join(matches)
        print(version)
    

    结果:

    1.23.35.10.2
    90.12.13.689
    13.23.789.0
    

    【讨论】:

      【解决方案3】:

      假设你的字符串中唯一的数字是你需要提取的版本,你可以尝试这样的事情:

       def func(someString):
          version = ''
          found = False 
          for character in someString:
              if character.isdigit():
                  found = True
              elif character.isalpha():
                  found = False
              if found:
                  version += character
          return version
      

      基本上我们搜索字符串的每个字符,并且当版本部分开始时找到变为真(因为'number'.isdigit() 返回true)。当我们到达那个部分时,每个字符都被添加到版本字符串中。 isdigit()isalpha() 是 python 基本库的一部分,所以你不需要导入任何东西。

      附:我还没有测试过这个错误

      【讨论】:

      • 我期待使用 re 模块。这行得通。但它非常静态。
      • 我试图用一个基本算法来解决这个问题,因为我对re 的了解仅限于一无所知。不过你是对的:)
      猜你喜欢
      • 2012-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-08
      • 1970-01-01
      相关资源
      最近更新 更多