Извините за вопрос такого низкого уровня, но я действительно пытался найти ответ, прежде чем прийти сюда... В основном у меня есть скрипт, который ищет внутри файлов .py и читает построчно там код -> объект скрипта состоит в том, чтобы найти, заканчивается ли строка пробелом или табуляцией, как в приведенном ниже примере.
i = 5
z = 25
По сути, после переменной i у нас должна быть переменная \s, а после переменной z - \t. (надеюсь формат кода его не сотрет)
def custom_checks(file, rule):
"""
@param file: file: file in-which you search for a specific character
@param rule: the specific character you search for
@return: dict obj with the form { line number : character }
"""
rule=re.escape(rule)
logging.info(f" File {os.path.abspath(file)} checked for {repr(rule)} inside it ")
result_dict = {}
file = fileinput.input([file])
for idx, line in enumerate(file):
if re.search(rule, line):
result_dict[idx + 1] = str(rule)
file.close()
if not len(result_dict):
logging.info("Zero non-compliance found based on the rule:2 consecutive empty rows")
else:
logging.warning(f'Found the next errors:{result_dict}')
После этого, если я проверю вывод журнала, я увижу это: проверил '\+s\\s\$' внутри него, я не знаю, почему \ двойные Также в основном я получаю все регулярные выражения из config.json, а именно:
{
"ends with tab":"+\\t$",
"ends with space":"+s\\s$"
}
Может ли кто-нибудь помочь мне в этом направлении-> Я в основном знаю, что могу сделать это другими способами, такими как перевернуть строку [::-1] получить первый символ и посмотреть, есть ли его \s и т. д., но я действительно хочу сделать это с помощью регулярное выражение Спасибо!
Извините, так что в основном правило состоит из 2 членов json: "+\\t$" и ""+s\\s$', и в основном я получаю файлы json в dict -> и вызываю custom_checks() со значениями из списка (составленного значениями файла json()..)
Но если вы избежите его, то плюс и доллар будут литералами для регулярного выражения. Предоставленные вами строки регулярных выражений не должны быть экранированы. Также имейте в виду, что \s также будет соответствовать \t.
Мне жаль? Это последний вопрос для меня? Ну, в основном, я хочу сохранить все параметры регулярных выражений в config.json..
Да, фактическое скрытое это делается снаружи в функции get_config ..






Пытаться:
rules = {
'ends with tab': re.compile(r'\t$'),
'ends with space': re.compile(r' $'),
}
Примечание: при получении строк из итерации файла новая строка ('\n') будет оставлена в конце каждой строки, $ в регулярном выражении соответствует положению перед первым newline в строке. Таким образом, при использовании регулярного выражения вам не нужно явно удалять символы новой строки.
if rule.search(line):
...
Однако лично я бы использовал line.rstrip() != line.rstrip('\n'), чтобы пометить конечные пробелы любого типа одним выстрелом.
Если вы хотите напрямую проверить наличие определенных символов в конце строки, вам нужно удалить любую новую строку и проверить, не пуста ли строка. Например:
char = '\t'
s = line.strip('\n')
if s and s[-1] == char:
...
# here from a string, but could be in a file, of course
json_config = """
{
"ends with tab": "\\t$",
"ends with space": " $"
}
"""
rules = {k: re.compile(v) for k, v in json.loads(json_config).items()}
Ниже показано, как закомментировать правило, а также правило обнаружения комментариев в обрабатываемом файле. Поскольку JSON не поддерживает комментарии, вместо этого мы можем рассмотреть yaml:
yaml_config = """
ends with space: ' $'
ends with tab: \\t$
is comment: ^\\s*#
# ignore: 'foo'
"""
import yaml
rules = {k: re.compile(v) for k, v in yaml.safe_load(yaml_config).items()}
Примечание: 'is comment' легко. Гипотетический 'has comment' определить гораздо сложнее — почему? Я оставлю это в качестве упражнения для читателя ;-)
Примечание 2: в файле конфигурация yaml будет без двойной обратной косой черты, например:
cat > config.yml << EOF
ends with space: ' $'
ends with tab: \t$
is comment: ^\s*#
# ignore: 'foo'
EOF
Вы можете попробовать autopep8.
Пример:
cat > foo.py << EOF
# this is a comment
text = """
# xyz
bar
"""
def foo():
# to be continued
pass
def bar():
pass
EOF
Примечание: чтобы открыть лишние пробелы:
cat foo.py | perl -pe 's/$/|/'
# this is a comment |
|
text = """|
# xyz |
bar |
"""|
def foo(): |
# to be continued |
pass |
|
def bar():|
pass |
|
|
|
Есть несколько проблем PEP8 с вышеизложенным (лишние пробелы в конце строк, только 1 строка между функциями и т. д.). Autopep8 исправляет их все (но правильно оставляет текстовую переменную без изменений):
autopep8 foo.py | perl -pe 's/$/|/'
# this is a comment|
|
text = """|
# xyz |
bar |
"""|
|
|
def foo():|
# to be continued|
pass|
|
|
def bar():|
pass|
Здравствуйте, спасибо, мне удалось провести рефакторинг на основе вашего первого ответа, но это очень помогло, все работает... Хорошего дня! :)
Не могли бы вы сказать мне, пожалуйста, в фактических правилах есть способ добавить, если выражение начинается с «#» -> синтаксис комментария python ... не принимайте это во внимание?
Вы имеете в виду указать правило, которое не должно применяться, или правило для обнаружения закомментированных строк в файле?
Не применяется, если строка начинается с '#', но я имею в виду, что если это возможно сделать внутри выражения регулярного выражения, что-то вроде r'if не начинается с # +\t$'
поскольку я не могу понять, какой случай вы хотите обработать, я изменил вопрос, указав лечение для обоих...
Большое спасибо, основная цель скрипта: D - не находить файлы, которые не соблюдают стандартную директиву pep8 .... в config.json я должен иметь возможность добавлять все больше и больше выражений, и он должен создавать журнал, в котором find , я думал, что начну с этого примера, это было бы проще, но я не знал об этой библиотеке: D, так что еще раз спасибо :)
Непонятно, что такое
ruleи зачем вы используетеrule=re.escape(rule). Является лиruleпростой текстовой строкой?