Regex для извлечения только буквенно-цифровых слов - PullRequest
0 голосов
/ 06 января 2019

Я ищу регулярное выражение для извлечения слова, содержащего ТОЛЬКО алфавитно-цифровые символы:

string = 'This is a $dollar sign !!'
matches = re.findall(regex, string)
matches = ['This', 'is', 'sign']

Это может быть сделано путем токенизации строки и оценки каждого токена в отдельности с использованием следующего регулярного выражения:

^[a-zA-Z0-9]+$

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

regex = \b[a-zA-Z0-9]+\b

, но все равно извлекает подстроки, содержащие буквенно-цифровые символы:

string = 'This is a $dollar sign !!'
matches = re.findall(regex, string)
matches = ['This', 'is', 'dollar', 'sign']

Есть ли регулярное выражение, способное это осуществить? Я пробовал разные вещи, но не могу найти решение.

Ответы [ 3 ]

0 голосов
/ 06 января 2019

Для этого не нужно использовать регулярные выражения, в python есть встроенный isalnum строковый метод. Смотри ниже:

string = 'This is a $dollar sign !!'

matches = [word for word in string.split(' ') if word.isalnum()]
0 голосов
/ 06 января 2019

[Отредактировано благодаря комментарию Хабза. Я неправильно понял вопрос]

В зависимости от вашего намерения, вы также можете «разделить» вместо «совпадения».

 >>> matches = re.split(r'(?:\s*\S*[\$\!]+\S*\s*|\s+)', string)

 ['This', 'is', 'a', 'sign', '']

А если вам нужно удалить начальную или конечную пустую строку:

>>> matches = [x for x in re.split(r'(?:\s*\S*[\$\!]+\S*\s*|\s+)', a) if x ]
['This', 'is', 'a', 'sign']

Ответ CertainPerformance с использованием взгляда назад и вперед - самый компактный. Использование разделения иногда является преимуществом, когда указывается исключение, то есть приведенное выше регулярное выражение описывает, что необходимо исключить. Однако в этом случае указывается буквенно-цифровое включение, поэтому использование split () не очень хорошая идея.

0 голосов
/ 06 января 2019

Вместо границ слова ищите пробелы (или начало / конец строки):

(?:^|(?<= ))[a-zA-Z0-9]+(?= |$)

https://regex101.com/r/TZ7q1c/1

Обратите внимание, что "a" - это отдельное буквенно-цифровое слово, поэтому оно также включено.

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