Разделение строки с использованием различных сценариев с использованием регулярных выражений

#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']