Существует ли строка регулярного выражения <regex>, такая, что re.findall(r'<regex>', doc) вернет тот же результат, что и следующий код?
doc = ' th_is is stuff. and2 3things if y4ou kn-ow ___ whaaaat iii mean)'
new_doc = []
for word in re.split(r'\s+', doc.strip()):
if not re.search(r'(.)\1{2,}|[_\d\W]+', word):
new_doc.append(word)
>>> new_doc
['is', 'if']
Что вы хотите от регулярного выражения фактически?
Итак, я попытался это понять. Вы хотите, чтобы регулярное выражение соответствовало словам в предложении, не имеющим повторяющейся буквы и не имеющим цифры, подчеркивания или несловесного символа?
Я не понимаю. Ваш код работает у меня. Пожалуйста, опубликуйте ошибку / проблему, которую вы нашли в своем коде.
@CoffeehouseCoder, да, приведенный выше код работает - я прошу способ сделать это в одной строке (без цикла for), возможно, используя re.findall(). Требуемые условия, как вы сказали, - это «сопоставить слова в предложении, которые не содержат повторяющихся букв и не имеют цифр, подчеркивания или несловесных символов».





Возможно, ваш нынешний способ получения совпадений - лучший.
Вы не можете этого сделать без дополнительных операций, например понимание списка, потому что re.findall с шаблоном, который содержит группу захвата, выводит захваченные подстроки в результирующий список.
Таким образом, вы можете либо добавить внешнюю группу захвата и использовать re.findall, либо использовать re.finditer и получить первую группу, используя
(?<!\S)(?!\S*(\S)\1{2}|\S*(?!\s)[_\d\W])\S+
См. эта демонстрация регулярного выражения.
Подробности
(?<!\S) - пробел или начало строки должны быть сразу слева от текущего местоположения(?!\S*(\S)\1{2}|\S*(?!\s)[_\d\W]) - не может быть 3 одинаковых символов без пробелов или символа, который является _, цифрой или любым символом без слова, кроме пробелов, после любых 0+ непробельных символов сразу справа от текущего местоположения\S+ - 1+ непробельных символов.См. демонстрация Python:
import re
doc = ' th_is is stuff. and2 3things if y4ou kn-ow ___ whaaaat iii mean)'
new_doc = [x.group(0) for x in re.finditer(r'(?<!\S)(?!\S*(\S)\1{2}|\S*(?!\s)[_\d\W])\S+', doc)]
print(new_doc) # => ['is', 'if']
new_doc2 = re.findall(r'(?<!\S)((?!\S*(\S)\2{2}|\S*(?!\s)[_\d\W])\S+)', doc)
print([x[0] for x in new_doc2]) # => ['is', 'if']
Опубликуйте фактические условия, которые вы хотите, а не просто один расплывчатый образец вывода.