Я анализирую некоторый пользовательский ввод, чтобы создать базового бота Discord, назначающего роли и тому подобное. Я пытаюсь обобщить некоторый код для повторного использования для разных похожих задач (выполняя аналогичные вещи в разных категориях/каналах).
Как правило, я ищу подстроку (категорию), а затем беру строку после значения этой категории. Я ищу строку за строкой для своей категории, заменяя подстроку «категория» и возвращая урезанную версию. Однако то, что у меня есть сейчас, также заменяет любой пробел в строке «значение».
Первоначально строка выглядит так:
Gamertag : 00test gamertag
Что я хочу сделать, так это сохранить пробелы в значении. Регулярное выражение, которое я пытаюсь сделать, это: сопоставить все не буквенно-цифровые символы до первой буквы.
Мой возврат уже соответствует не альфа-каналу, но я не могу понять, как получить только первую группу, похоже, он должен просто добавить? чтобы сделать его ленивым оператором, но не уверен ... пример кода и строки ниже (регулярное выражение, которое я хочу заменить, - это окончательная строка печати).
Строка, с которой я работаю:
- 00test Gamertag #(or any non-alpha delimiter)
Желаемые результаты (путем сопоставления и удаления лишних символов)
00test Gamertag #(remove leading space and any non-alpha characters before the first words)
Регулярное выражение, которое я пытаюсь сделать, это: сопоставить все не буквенно-цифровые символы до первой буквы. Должно быть что-то вроде следующего, что близко к тому, что я сейчас использую для удаления не-альф, но все это не первая группа, поэтому я хочу сопоставить первую группу не-альфа в строке, чтобы удалить эту часть, используя re .sub..
\W+?
Https://www.online-python.com/gDVhZrnmlq
Спасибо!
Разделитель и интервал не всегда одинаковы, это всего лишь один общий пример.
Вы имеете в виду, что получить только первую группу, получающую только первое слово, например, 00test для - 00test Gamertag?
Нет, на самом деле я думаю, что использую регулярное выражение, противоположное тому, как я объяснил. Я сопоставляю то, что хочу удалить, а затем разделяю это. Итак, я пытаюсь сопоставить первую группу не альфа-символов, чтобы удалить их с помощью re.sub. В этом случае есть разделитель "-", но иногда это также просто пробелы впереди. И я пытаюсь сохранить пробел в строке.
На самом деле, я не понимаю проблемы. Что не так с выводом, который вы получаете с вашей программой?
@trincot, что вы имеете в виду, что gamer_tag должен быть назначен один раз из line.replace, чтобы получить строку «значение» из этой строки, а затем последний шаг — это то, где я хочу удалить не-альфа и вернуть строку. Он также установлен в = "" в начале.
^\W+ то, что вы ищете?
@trincot да, это именно то, что я искал! Если вы хотите опубликовать в качестве ответа, я дам вам кредит, поскольку вы опубликовали первым и именно то, о чем я просил. (крик с другим хорошим ответом, хотя)
Это зависит от ваших входных данных, вы можете использовать два регулярных выражения для достижения своей цели: первое, чтобы удалить все не буквенно-цифровые из вашей строки, включая те, что между словами, и второе, чтобы удалить пробелы между словами, если есть более одного пробела между каждыми двумя словами:
import re
gamer_tag = "µ& - 00test - Gamertag"
gamer_tag = re.sub(r"[^a-zA-Z0-9\s]", "", gamer_tag)
gamer_tag = re.sub(r" +", " ", gamer_tag)
print(gamer_tag.strip())
# Output: 00test Gamertag
Второй re.sub() можете убрать, если уверены, что между словами будет не более одного пробела.
gamer_tag = "- 00test Gamertag "
gamer_tag = re.sub(r"[^a-zA-Z0-9\s]", "", gamer_tag)
print(gamer_tag.strip())
# Output: 00test Gamertag
Спасибо за Ваш ответ! Похоже, он делает то, что я просил, хотя и не совсем с использованием группировки регулярных выражений, как я пытался получить.. Дал тринкоту ответ на вопрос, потому что они сначала ответили точным регулярным выражением.. Тем не менее, благодарю вас за помощь!
Ваше регулярное выражение заменит не буквенно-цифровые символы в любом месте входной строки. Если вам нужно, чтобы это происходило только в начале строки, используйте якорь начала ввода (т.е. ^):
^\W+
Это именно то, что я искал, спасибо, я думал, что мне нужно использовать ленивый оператор, чтобы выбрать только первое совпадение. Регулярное выражение - это настоящая борьба, но, как по волшебству, вы можете сделать с одной его строкой.
Почему бы не просто split(' - ')?