Регулярное выражение для соответствия первому вхождению не буквенно-цифровых символов

Я анализирую некоторый пользовательский ввод, чтобы создать базового бота 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

Спасибо!

Почему бы не просто split(' - ')?

Tim Roberts 10.01.2023 21:05

Разделитель и интервал не всегда одинаковы, это всего лишь один общий пример.

nick 10.01.2023 21:10

Вы имеете в виду, что получить только первую группу, получающую только первое слово, например, 00test для - 00test Gamertag?

SWEEPY 10.01.2023 21:11

Нет, на самом деле я думаю, что использую регулярное выражение, противоположное тому, как я объяснил. Я сопоставляю то, что хочу удалить, а затем разделяю это. Итак, я пытаюсь сопоставить первую группу не альфа-символов, чтобы удалить их с помощью re.sub. В этом случае есть разделитель "-", но иногда это также просто пробелы впереди. И я пытаюсь сохранить пробел в строке.

nick 10.01.2023 21:13

На самом деле, я не понимаю проблемы. Что не так с выводом, который вы получаете с вашей программой?

trincot 10.01.2023 21:15

@trincot, что вы имеете в виду, что gamer_tag должен быть назначен один раз из line.replace, чтобы получить строку «значение» из этой строки, а затем последний шаг — это то, где я хочу удалить не-альфа и вернуть строку. Он также установлен в = "" в начале.

nick 10.01.2023 21:18

^\W+ то, что вы ищете?

trincot 10.01.2023 21:32

@trincot да, это именно то, что я искал! Если вы хотите опубликовать в качестве ответа, я дам вам кредит, поскольку вы опубликовали первым и именно то, о чем я просил. (крик с другим хорошим ответом, хотя)

nick 10.01.2023 22:42
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
8
61
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это зависит от ваших входных данных, вы можете использовать два регулярных выражения для достижения своей цели: первое, чтобы удалить все не буквенно-цифровые из вашей строки, включая те, что между словами, и второе, чтобы удалить пробелы между словами, если есть более одного пробела между каждыми двумя словами:

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

Спасибо за Ваш ответ! Похоже, он делает то, что я просил, хотя и не совсем с использованием группировки регулярных выражений, как я пытался получить.. Дал тринкоту ответ на вопрос, потому что они сначала ответили точным регулярным выражением.. Тем не менее, благодарю вас за помощь!

nick 10.01.2023 22:57
Ответ принят как подходящий

Ваше регулярное выражение заменит не буквенно-цифровые символы в любом месте входной строки. Если вам нужно, чтобы это происходило только в начале строки, используйте якорь начала ввода (т.е. ^):

^\W+

Это именно то, что я искал, спасибо, я думал, что мне нужно использовать ленивый оператор, чтобы выбрать только первое совпадение. Регулярное выражение - это настоящая борьба, но, как по волшебству, вы можете сделать с одной его строкой.

nick 10.01.2023 22:59

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