#python #regex #python-3.x
#python #регулярное выражение #python-3.x
Вопрос:
У меня есть 2 сценария, поэтому разделите строку сценарий 1:
"@#$hello?? getting good.<li>hii"
Я хочу быть разделен как 'hello','getting','good.<li>hii
(Сценарий 1)
'hello','getting','good','li,'hi' (Scenario 2)
Пожалуйста, есть идеи??
Комментарии:
1. Каковы требования? Неясно, что должно произойти с
<<<hello>>>> no.good
, или"@#$hello?? getting good. <li>hii"
Ответ №1:
Что-то вроде этого должно сработать:
>>> re.split(r"[^w<>.] ", s) # or re.split(r"[@#$? ] ", s)
['', 'hello', 'getting', 'good.<li>hii']
>>> re.split(r"[^w] ", s)
['', 'hello', 'getting', 'good', 'li', 'hii']
Комментарии:
1. Прошу прощения за то, что не передал вопрос четко, в сценарии 2 мне нужны только буквенно-цифровые обозначения (буквы, цифры и подчеркивание)
2. Чтобы сделать то же самое, что указано выше, но включая подчеркивание и не вызывая ‘.’ или ‘<>’ используйте [^w_]
Ответ №2:
Это может быть то, что вы ищете w оно соответствует любой цифре или букве от 1 до n раз столько раз, сколько возможно. Вот рабочий Java-скрипт
var value = "@#$hello?? getting good.<li>hii";
var matches = value.match(
new RegExp("\w ", "gi")
);
console.log(matches)
Это работает с использованием w , который сопоставляет символы word как можно больше раз. Вы также можете использовать [A-Za-b] для сопоставления только букв, которые не являются цифрами. Как показано здесь.
var value = "@#$hello?? getting good.<li>hii777bloop";
var matches = value.match(
new RegExp("[A-Za-z] ", "gi")
);
console.log(matches)
Это соответствует тому, что находится в скобках от 1 до n раз, как можно большему количеству. В данном случае диапазон символов нижнего регистра от a до z и диапазон символов верхнего регистра от A до Z. Надеюсь, это то, что вы хотите.
Ответ №3:
Для первого сценария просто используйте regex
, чтобы найти все слова, которые содержат символы word и <>.
:
In [60]: re.findall(r'[w<>.] ', s)
Out[60]: ['hello', 'getting', 'good.<li>hii']
Для второго вам нужно заменить повторяющиеся символы, только если они не являются допустимыми английскими словами, вы можете сделать это с помощью nltk
corpus и re.sub
regex:
In [61]: import nltk
In [62]: english_vocab = set(w.lower() for w in nltk.corpus.words.words())
In [63]: repeat_regexp = re.compile(r'(w*)(w)2(w*)')
In [64]: [repeat_regexp.sub(r'123', word) if word not in english_vocab else word for word in re.findall(r'[^W] ', s)]
Out[64]: ['hello', 'getting', 'good', 'li', 'hi']
Ответ №4:
На случай, если вы ищете решение без regex
. string.punctuation
выдаст вам список всех специальных символов. Используйте этот список с пониманием списка для достижения желаемого результата как:
>>> import string
>>> my_string = '@#$hello?? getting good.<li>hii'
>>> ''.join([(' ' if s in string.punctuation else s) for s in my_string]).split()
['hello', 'getting', 'good', 'li', 'hii'] # desired output
Объяснение: Ниже приведена пошаговая инструкция о том, как это работает:
import string # Importing the 'string' module
special_char_string = string.punctuation
# Value of 'special_char_string': '!"#$%amp;'()* ,-./:;<=>?@[\]^_`{|}~'
my_string = '@#$hello?? getting good.<li>hii'
# Generating list of character in sample string with
# special character replaced with whitespace
my_list = [(' ' if item in special_char_string else item) for item in my_string]
# Join the list to form string
my_string = ''.join(my_list)
# Split it based on space
my_desired_list = my_string.strip().split()
Значение my_desired_list
будет:
['hello', 'getting', 'good', 'li', 'hii']