2013-12-17 3 views
-5

Мне нужно регулярное выражение, чтобы оно соответствовало строке, только если оно содержит не менее X слов.regex, чтобы соответствовать строке с минимальным количеством слов

Где слово определено как непрерывная последовательность без пробелов.

Я использую re.findall().

+1

Вы что-нибудь пробовали? – bgusach

+0

Я, кажется, получаю катастрофическое отступление. – eyaler

+1

Извините, но без каких-либо попыток это выглядит как «пожалуйста, сделайте мою домашнюю работу» – bgusach

ответ

3

Хмм, вы можете использовать класс символов \S+, чтобы обозначить слово.

\S эквивалентно [^\s] который сам по себе эквивалентна [^ \v\t\f\n\r] (в порядке их я напечатал: белое пространство, вертикальные вкладки, горизонтальные вкладки, форма подача, новая строка, возврат каретки).

[^ ... ] указывает отрицательный класс, в котором будут сопоставляться все символы, кроме тех, что находятся внутри класса.

Теперь, для того, что вы пытаетесь сделать, я бы предпочел использовать re.match так:

re.match(r'\s*\S+(?:\s+\S+){X-1,}', text_to_validate) 

(?:\s+\S+) спичек пространство (ы) с последующим словом.

{X-1,} означает, что группа (?:\s+\S+) должна появиться как минимум X-1 раз, чтобы соответствовать. Если X = 4, то оно становится {3,}.

ideone demo


Альтернативный, разделить на пространствах, и подсчитать число элементов:

re.split(r"\s+", text_to_validate) 

ideone demo

+0

не «0 или более раз» подразумевает, что вы бы соответствовали строке из X последовательных символов без пробелов? как бы вы это сделали с re.findall? – eyaler

+0

@eyaler Извините, я редактировал регулярное выражение. Я забыл что-то очень важное. К вашему первому вопросу, нет, наличие '\ S +' заставляет регулярное выражение соответствовать хотя бы одному слову. К вашему второму вопросу вы можете использовать одно и то же регулярное выражение. Просто ваш способ проверить, проходит ли 'text_to_validate' или нет. 're.match' возвращает объект,' re.findall' возвращает список. – Jerry

+1

@eyaler Не уверен, есть ли какие-либо проблемы с предложенным решением, но я добавил демо к ответу. – Jerry

-2
import re 

subject = """I need a regex to match a string only if it contains at least X words. 
Where a word is defined as any continuous non-whitespace sequence. 
I am using Python 3 and re.findall()""" 

result = re.findall(r"([\S]+)", subject) 

if len(result) > 5: 
    print "yes" 
else: 
    print "no" 

http://labs.codecademy.com/

+0

findall должен соответствовать всей строке в одном совпадении – eyaler

Смежные вопросы