【问题标题】:How to recognize string patterns?如何识别字符串模式?
【发布时间】:2015-04-03 11:57:08
【问题描述】:

我想在 python 中对字符串进行分组,但我真的不知道如何解决这个问题。

假设我有一个文件名列表:

test-1.jpg
test-2.jpg
test-3.jpg
supertest-828.jpg
supertest-8429.jpg
5-mega-5435-test.jpg
5-mega-453-test.jpg
5-mega-325-test.jpg

现在我想按它们的系列名称对它们进行分组。一个好的结果可能是这样的字典:

{"test-x.jpg":("test-1.jpg","test-2.jpg","test-3.jpg"), "supertest-x.jpg":(...), "5-mega-x-test.jpg":(...)}

现在我想知道解决这个问题的最佳方法是什么。我不想替换文件名中的所有数字。相反,我需要一种方法来查找正在更改的数字,然后将其替换为“x”以获取该系列的标识符。

那么如何比较字符串并找出不相似的部分呢?

可能的洞穴加热是多个变化的数字,需要 2 个或更多“x”通配符和字符串中不应更改的静态数字。

感谢您的帮助。

【问题讨论】:

  • 你可以使用Regex
  • Cave heats?你是说caveats
  • 从最后一组前面完全消失的5- 根本无法用您的文字解释——最后一组应该发生什么,真的 ?请澄清!
  • 抱歉描述不清楚。 5 不应更改,因为它是静态的。我只想确定变化的部分。

标签: python regex python-2.7 python-2.x


【解决方案1】:
import re

def genericize(s):
    # replace one or more digits with an "x"
    return re.sub("\d+", "x", s)   

然后

>>> genericize("test-29.jpg")
'test-x.jpg'

你的整个程序变成了

from collections import defaultdict

def group_fnames(lst):
    result = defaultdict(list)
    for fname in lst:
        result[genericize(fname)].append(fname)
    return result

然后

fnames = [
    'test-1.jpg',
    'test-2.jpg',
    'test-3.jpg',
    'supertest-828.jpg',
    'supertest-8429.jpg',
    '5-mega-5435-test.jpg',
    '5-mega-453-test.jpg',
    '5-mega-325-test.jpg'
]

print(group_fnames(fnames))

给予

{
    'supertest-x.jpg': ['supertest-828.jpg', 'supertest-8429.jpg'],
    'test-x.jpg': ['test-1.jpg', 'test-2.jpg', 'test-3.jpg'],
    'x-mega-x-test.jpg': ['5-mega-5435-test.jpg', '5-mega-453-test.jpg', '5-mega-325-test.jpg']
}

【讨论】:

  • 感谢您的回答,但问题是它应该给出 5-mega-x-test.jpg 而不是 x-mega-x-test.jpg,因为 5 是一个常数而不是一个序列。如何解决?
  • 识别静态数字将需要另一个后处理过程(因为在查看所有文件之前,您无法分辨哪些值是静态的;如果您找到“6-mega-18-test.jpg”,那么 5 -etc 不是静态的)。
猜你喜欢
  • 1970-01-01
  • 2011-04-09
  • 2010-12-27
  • 1970-01-01
  • 1970-01-01
  • 2016-05-17
  • 2018-12-14
  • 2018-08-14
  • 1970-01-01
相关资源
最近更新 更多