2013-05-02 2 views
4

У меня есть регулярное выражение, которое соответствует всем трем символов слова в строке:Python Regex не соответствует. (Точка) как символ

\b[^\s]{3}\b 

Когда я использую его со строкой:

And the tiger attacked you. 

это результат:

regex = re.compile("\b[^\s]{3}\b") 
regex.findall(string) 
[u'And', u'the', u'you'] 

Как вы можете видеть, это соответствует вам как слово из трех символов, но я хочу, чтобы выражение принимало вас. с "." как слово 4 символа.

У меня такая же проблема с «», „“, „:“ и т.д.

Я довольно новым с регулярным выражением, но я предполагаю, что это происходит потому, что эти символы рассматриваются как границы слов.

Есть ли способ сделать это?

Спасибо заранее,

EDIT

Thaks к ответам @BrenBarn и @Kendall Frey мне удалось добраться до регулярных выражений я искал:

(?<!\w)[^\s]{3}(?=$|\s) 
+3

Это, очевидно, не будет соответствовать ничего 4-символьный, если сказать ему, он должен соответствовать ровно 3 символов. Какие именно правила вы хотите использовать, чтобы решить, когда/когда нужно соответствовать четвертому персонажу? – BrenBarn

+1

Я не хочу, чтобы это соответствовало, я просто хочу, чтобы вы были обработаны как 4-символьные слова, чтобы он не соответствовал регулярному выражению. – xgusix

+0

Какие символы вы хотите считать границами слов? – BrenBarn

ответ

3

Если вы хотите чтобы слово предшествовало и сопровождалось пробелом (а не таким периодом, как это происходит в вашем случае), затем используйте lookaround.

(?<=\s)\w{3}(?=\s) 

Если вам это нужно, чтобы соответствовать пунктуацию как часть слова (например, «в».), То \w не будет достаточно, и вы можете использовать \S (ничего, кроме пространства)

(?<=\s)\S{3}(?=\s) 
+0

Он пояснил в комментарии, что не хочет соответствовать пунктуации; скорее, он хочет, чтобы период считался символом слова, поэтому он не позволяет совпадению слова «вы». (потому что это более трех символов). – BrenBarn

+0

@BrenBarn Обновлено. Благодарю. –

+0

Ваш пример все равно не будет работать, потому что '\ w' не будет соответствовать периодам. – BrenBarn

1

как описано в the documentation:

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

Таким образом, если вы хотите, чтобы период считался символом слова, а не границей слова, вы не можете использовать \b для обозначения границы слова. Вам придется использовать свой собственный класс персонажа. Например, вы можете использовать регулярное выражение, например \s[^\s]{3}\s, если вы хотите совместить 3 непространственных символа, окруженных пробелами. Если вы все еще хотите, чтобы граница была нулевой ширины (т. Е. Ограничивала совпадение, но не включалась в нее), вы можете использовать lookaround, что-то вроде (?<=\s)[^\s]{3}(?=\s).

1

Это был бы мой подход. Также соответствует словам, которые появляются сразу после пунктуации.

import re 

r = r''' 
     \b     # word boundary 
     (     # capturing parentheses 
      [^\s]{3}   # anything but whitespace 3 times 
      \b    # word boundary 
      (?=[^\.,;:]|$) # dont allow . or , or ; or : after word boundary but allow end of string 
     |     # OR 
      [^\s]{2}   # anything but whitespace 2 times 
      [\.,;:]   # a . or , or ; or : 
     ) 
    ''' 
s = 'And the tiger attacked you. on,bla tw; th: fo.tes' 

print re.findall(r, s, re.X) 

выход:

['And', 'the', 'on,', 'bla', 'tw;', 'th:', 'fo.', 'tes'] 
Смежные вопросы