Python, regex: найти и заменить все экземпляры "yyyy", кроме тех, которые находятся перед точкой - PullRequest
1 голос
/ 26 июня 2019

Я пытаюсь найти числовую строку и заменить ее. Например, скажем «1998», и замените его на «1999» во всех файлах в текущем каталоге. Однако я не хочу проводить эту замену для строк, которые выглядят как «1998». (т.е. 1998.csv, 1998.png, 1998.xlsx и т. д.). Как мне это сделать? Я посмотрел документацию для replace(), и у нее нет параметров для регулярных выражений.

inputDir = "."
outputDir = "./test"
find = "1998"
replace = "1999" 

for path, dirs, files in os.walk(os.path.abspath(inputDir)): 
        for filename in fnmatch.filter(files, filePattern):
            filepath = os.path.join(path, filename)
        with open(filepath) as f:
            s = f.read()
            s = s.replace(find, replace) # second, update all years

Ответы [ 2 ]

1 голос
/ 26 июня 2019

Вы можете найти 1998 и использовать lookarounds с re.sub , чтобы утверждать, что происходит непосредственно перед (?<!\S) и после (?!\S) не является \S непробельным символом.

В замене используйте 1999

(?<!\S)1998(?!\S)

Строка в вашем коде может выглядеть следующим образом:

s = re.sub(r"(?<!\S)1998(?!\S)", "1999", s)

Regex demo | Python demo

Пример

import re
regex = r"(?<!\S)1998(?!\S)"
test_str = ("this is 1998\n"
    "1998.csv 1998.png, 1998.xlsx")

result = re.sub(regex, "1999", test_str)

if result:
    print (result)

Результат

this is 1999
1998.csv 1998.png, 1998.xlsx 1999

Другой вариант, если последующее не может быть только точкой, - использовать отрицательный прогноз и начать 1998 с границы слова:

\b1998(?!\.)
0 голосов
/ 26 июня 2019

это то, что работает для меня! вам нужно использовать (? <= ...), проверьте <a href="https://docs.python.org/3/library/re.html" rel="nofollow noreferrer"> python re

>>> import re
>>> a='Sample 1998 test with 1998.txt file'
>>> re.sub('(?<!\S)1998(?!\S)', '1999', a)
'Sample 1999 test with 1998.txt file'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...