Regex для получения не алфавитно-цифровых строк между буквенно-цифровыми строками - PullRequest
1 голос
/ 16 мая 2019

Допустим, у меня есть эта строка:

Alpha+*&Numeric%$^String%%$

Я хочу получить не алфавитно-цифровые символы, которые находятся между буквенно-цифровыми символами:

+*& %$^

У меня есть это регулярное выражение: [^0-9a-zA-Z]+, но оно дает мне

+* %$^ %%$

, который включает хвостовые не буквенно-цифровые символы, которые я не хочу. Я также пытался [0-9a-zA-Z]([^0-9a-zA-Z])+[0-9a-zA-Z], но это дает мне

a+*&N c%$^S

, которые включают символы a, N, c и S

Ответы [ 2 ]

2 голосов
/ 16 мая 2019

Если вы не возражаете, включив символ _ в качестве буквенно-цифровых данных, вы можете извлечь все не-буквенно-цифровые данные с помощью этого:

some_string = "A+*&N%$^S%%$"

import re
result = re.findall(r'\b\W+\b', some_string)  # sets result to:  ['+*&', '%$^']

Обратите внимание на мое использование \b вместо чего-то вроде \w или [^\W].

\w и [^\W] каждый соответствует одному символу, поэтому если ваша буквенно-цифровая строка (между нужным текстом) ровно один символто, что, по вашему мнению, должно соответствовать следующему совпадению, не будет совпадать.

Но поскольку \b является «границей слов нулевой ширины», не имеет значения, сколько здесь буквенно-цифровых символов,пока есть хотя бы один.

1 голос
/ 16 мая 2019

Единственная проблема с вашей второй попыткой - это местоположение квалификатора + - оно должно быть внутри скобок.Вы также можете использовать слово класс символов \w и его инверсию \W, чтобы вытащить эти элементы, которые аналогичны вашему второму регулярному выражению, но включают в себя подчеркивания _ как части слов:

import re

s = "Alpha+*&Numeric%$^String%%$"

print(re.findall(r"\w(\W+)\w", s))                             # adds _ character
print(re.findall(r"[0-9a-zA-Z]([^0-9a-zA-Z]+)[0-9a-zA-Z]", s)) # your version fixed
print(re.findall(r"(?i)[0-9A-Z]([^0-9A-Z]+)[0-9A-Z]", s))      # same as above

Выход:

['+*&', '%$^']
['+*&', '%$^']
['+*&', '%$^']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...