'。'的模式用任意数量的空格分隔的单词

时间:2014-01-31 15:12:04

标签: python regex

这是我第一次在Python中使用正则表达式而我无法让它工作。

这是我想要实现的目标:我想找到所有字符串,其中有一个单词后跟一个点后跟另一个单词。之后有一个未知数量的空格,后跟(off)(on)。例如:

word1.word2   (off)

这是我到目前为止所得到的。

string_group = re.search(r'\w+\.\w+\s+[(\(on\))(\(off\))]', analyzed_string)

\w+代表第一个字

\.

\w+代表第二个字

对于空白

\s+

对于[(\(on\))(\(off\))](off)

(on)

我认为最后一个表达可能不是我需要的。现在实现,程序确实在字符串中找到了正确的位置,但是

的输出
string_group.group(0)

只是

word1.word2   (

而不是我正在寻找的整个表达。你能不能给我一个提示我做错了什么?

4 个答案:

答案 0 :(得分:3)

你的逻辑或混合了。

[(\(on\))(\(off\))]

应该是

\((?:on|off)\)

[]仅用于匹配单个字符。

答案 1 :(得分:3)

[ ... ]用于字符类,并且将匹配其中的任何一个字符,除非您将量词:[ ... ]+放置一次或多次。

但是简单地添加它将无效......

\w+\.\w+\s+[(\(on\))(\(off\))]+

也会匹配word1.word2 )(fno(nofn之类的垃圾内容,所以你实际上不想使用字符类,因为它会以任何顺序匹配字符。您可以使用的是捕获组,非捕获组以及OR运算符|

\w+\.\w+\s+(\((?:on|off)\))

(?:on|off)将匹配onoff

现在,如果您不喜欢括号,要在第一组中被捕获,您可以将其更改为:

\w+\.\w+\s+\((on|off)\)

答案 2 :(得分:1)

方括号是字符类,它匹配括号中的任何一个字符。您似乎正在尝试使用它来匹配其中一个子正则表达式(\(one\))(\(two\))。这样做的方法是使用交替操作,管道符号:(\(one\)|\(two\))

答案 3 :(得分:1)

我认为你的问题可能是方括号[] 它们表示要匹配的一组单个字符。因此,您的表达式将匹配以下任何字符的单个实例:“()ofn”

因此,对于字符串“word1.word2(on)”,您只匹配此部分:“word1.word2(”

请尝试使用此代码:

re.search(r'\w+\.\w+\s+\((on|off)\)', analyzed_string)

此匹配假设()将在那里,并在括号内查找“on”或“off”。