Шаблон регулярного выражения Python, чтобы определить, заканчивается ли строка кода пробелом или символом табуляции

Извините за вопрос такого низкого уровня, но я действительно пытался найти ответ, прежде чем прийти сюда... В основном у меня есть скрипт, который ищет внутри файлов .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 и т. д., но я действительно хочу сделать это с помощью регулярное выражение Спасибо!

Непонятно, что такое rule и зачем вы используете rule=re.escape(rule). Является ли rule простой текстовой строкой?

Wiktor Stribiżew 11.05.2022 13:17

Извините, так что в основном правило состоит из 2 членов json: "+\\t$" и ""+s\\s$', и в основном я получаю файлы json в dict -> и вызываю custom_checks() со значениями из списка (составленного значениями файла json()..)

Adrian Vulpeanu 11.05.2022 13:19

Но если вы избежите его, то плюс и доллар будут литералами для регулярного выражения. Предоставленные вами строки регулярных выражений не должны быть экранированы. Также имейте в виду, что \s также будет соответствовать \t.

trincot 11.05.2022 13:24

Мне жаль? Это последний вопрос для меня? Ну, в основном, я хочу сохранить все параметры регулярных выражений в config.json..

Adrian Vulpeanu 11.05.2022 13:34

Да, фактическое скрытое это делается снаружи в функции get_config ..

Adrian Vulpeanu 11.05.2022 14:18

зачем заново изобретать велосипед? Вы можете попробовать autopep8.

Pierre D 11.05.2022 15:16
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
6
47
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Пытаться:

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:
    ...

Приложение 1: чтение правил из конфигурации JSON

# 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()}

Приложение 2: комментарии

Ниже показано, как закомментировать правило, а также правило обнаружения комментариев в обрабатываемом файле. Поскольку 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|

Здравствуйте, спасибо, мне удалось провести рефакторинг на основе вашего первого ответа, но это очень помогло, все работает... Хорошего дня! :)

Adrian Vulpeanu 11.05.2022 13:51

Не могли бы вы сказать мне, пожалуйста, в фактических правилах есть способ добавить, если выражение начинается с «#» -> синтаксис комментария python ... не принимайте это во внимание?

Adrian Vulpeanu 11.05.2022 13:55

Вы имеете в виду указать правило, которое не должно применяться, или правило для обнаружения закомментированных строк в файле?

Pierre D 11.05.2022 14:35

Не применяется, если строка начинается с '#', но я имею в виду, что если это возможно сделать внутри выражения регулярного выражения, что-то вроде r'if не начинается с # +\t$'

Adrian Vulpeanu 11.05.2022 14:39

поскольку я не могу понять, какой случай вы хотите обработать, я изменил вопрос, указав лечение для обоих...

Pierre D 11.05.2022 14:48

Большое спасибо, основная цель скрипта: D - не находить файлы, которые не соблюдают стандартную директиву pep8 .... в config.json я должен иметь возможность добавлять все больше и больше выражений, и он должен создавать журнал, в котором find , я думал, что начну с этого примера, это было бы проще, но я не знал об этой библиотеке: D, так что еще раз спасибо :)

Adrian Vulpeanu 11.05.2022 15:21

Другие вопросы по теме