У меня есть этот код
import re
str1 = "These should be counted as a single-word, b**m !?"
match_pattern = re.findall(r'\w{1,15}', str1)
print(match_pattern)
Я хочу, чтобы результат был:
['These', 'should', 'be', 'counted', 'as', 'a', 'single-word', 'b**m']
Выходные данные должны исключать такие слова, как "!?" Какие еще проверки я должен использовать для сопоставления и достижения желаемого результата?






Я бы использовал границы слов (\b), заполненные одним или несколькими пробелами:
match_pattern = re.findall(r'\b\S+\b', str1)
результат:
['These', 'should', 'be', 'counted', 'as', 'a', 'single-word', 'b**m']
!? пропускается благодаря магии границы слова, которая также не считает это словом вообще.
\S также будет соответствовать !?@tripleee теоретически да, но работает. Хмммм, это мешает граница слов.
Большое спасибо @ Jean-FrançoisFabre!
Вы также можете добиться аналогичного результата, не используя RegEx:
string = "These should be counted as a single-word, b**m !?"
replacements = ['.',',','?','!']
for replacement in replacements:
if replacement in string:
string = string.replace(replacement, "");
print string.split()
>>> ['These', 'should', 'be', 'counted', 'as', 'a', 'single-word', 'b**m']
string.strip(element) ничего не делает.
Возможно, вам нужно что-то вроде [^\s.!?] вместо \w, но что именно вы хотите, не видно ни на одном примере. [^...] соответствует одному символу, который не находится в скобках, а \s соответствует пробельным символам (пробел, табуляция, новая строка и т. д.).
Решение без регулярного выражения:
str1.strip(string.punctuation).replace(',','').split()