Перестановка строк с регулярным выражением из файла - PullRequest
3 голосов
/ 04 мая 2020

Итак, у меня есть файл со строками, которые имеют разделитель (: :) Я хочу переключить их с помощью регулярных выражений, но мои попытки не работают

Содержимое файла:

foo:bar
foo:bar
foo:bar

Мой код:

combo = open("combo.txt", 'r')
outfile = open("checked.txt", 'w')
outfile.write(re.sub(r'(\d+)-(\d+)', r'\2-\1', combo.readlines()))
outfile.close

Ожидаемый результат:

bar:foo
bar:foo
bar:foo

Ответы [ 4 ]

2 голосов
/ 04 мая 2020

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

Это задание "split - reverse - join".

with open("combo.txt", 'r') as combo, open("checked.txt", 'w') as outfile:
    outfile.write(':'.join(reversed(line.split(':', 2))) for line in combo)
2 голосов
/ 04 мая 2020

Попробуйте с этим регулярным выражением: (\w+):(\w+) и замените на \2:\1

Код:

combo = open("combo.txt", 'r')
outfile = open("checked.txt", 'w')
outfile.write(re.sub(r'(\w+):(\w+)', r'\2:\1', combo.readlines()))
outfile.close

Демо здесь

1 голос
/ 04 мая 2020

Вы можете просто использовать метод string.split, чтобы получить желаемый результат, нет необходимости использовать регулярные выражения. Используйте:

with open("combo.txt") as r, open("checked.txt", "w") as w:
    for line in r:
        tokens = line.strip().split(":")
        w.write(f"{tokens[1]}:{tokens[0]}\n")

Если вы хотите использовать регулярное выражение,

import re

with open("combo.txt") as r, open("checked.txt", "w") as w:
    for line in r:
        w.write(re.sub(r"(\w+):(\w+)", r"\g<2>:\g<1>\n", line.strip()))

После выполнения кода выше содержимое файла checked должно выглядеть следующим образом:

bar:foo
bar:foo
bar:foo
0 голосов
/ 04 мая 2020

В основном вам нужно сделать то, что уже было предложено, но я бы немного ослабил регулярное выражение, чтобы оно также совпадало с числами и другими символами, пока оно не найдет первое :. Проверьте здесь: https://regex101.com/r/kH6kHn/1

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