用于检查字符串中单词的开头和结尾的python正则表达式

时间:2014-11-12 03:03:08

标签: python regex

我正在编写一个重命名文件的脚本。在这种情况下,有三种可能性。

1.file不存在:创建新文件

2.文件存在:使用文件名'(文件出现次数)创建新文件。例如filename(1)

3.文件的重复已存在:创建文件名为'(文件出现次数)'的新文件。例如filename(2)

我在字符串中有文件名。我可以使用正则表达式检查文件名的最后一个字符但是如何检查'('到')'中的最后一个字符并获取其中的数字?

2 个答案:

答案 0 :(得分:2)

你只需要这样的东西:

(?<=\()(\d+)(?=\)[^()]*$)

Demo

说明:

  • (?<=\()必须以文字(
  • 开头
  • (\d+)匹配并捕获数字
  • (?=\)[^()]+$)必须后跟),然后不再是(),直到字符串结尾。

示例:如果文件名为Foo (Bar) Baz (23).jpg,则上面的正则表达式匹配23

答案 1 :(得分:0)

以下是基于现有文件名获取文件名的代码和测试:

import re

def get_name(filename, existing_names):
    exist = False
    index = 0

    p = re.compile("^%s(\((?P<idx>\d+)\))?$" % filename)

    for name in existing_names:
        m = p.match(name)
        if m:
            exist = True
            idx = m.group('idx')
            if idx and int(idx) > index:
                index = int(idx)
    if exist:
        return "%s(%d)" % (filename, index + 1)
    else:
        return filename

# test data
exists = ["abc(1)", "ab", "abc", "abc(2)", "ab(1)", "de", "ab(5)"]
tests = ["abc", "ab", "de", "xyz"]
expects = ["abc(3)", "ab(6)", "de(1)", "xyz"]

print exists
for name, exp in zip(tests, expects):
    new_name = get_name(name, exists)
    print "%s -> %s" % (name, new_name)
    assert new_name == exp

查看此行的正则表达式以获取(*)中的数字:

p = re.compile("^%s(\((?P<idx>\d+)\))?$" % filename)

此处它使用命名的捕获?P<idx>\d+作为数字\d+,稍后使用m.group('idx')访问捕获。