2014-01-31 38 views
3

这是我第一次在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 (

,而不是整个表达式我在寻找。你能给我一个暗示我做错了什么吗?

回答

3

[ ... ]用于字符类,除非你把量词将匹配在他们里面的任何一个字符[ ... ]+一个或更多的时间。

但是仅仅补充说,将无法正常工作......

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

将匹配垃圾的东西一样word1.word2)(fno(nofn太多,所以你其实并不希望使用一个字符类,因为它会匹配字符以任何顺序。你可以使用一个捕获组,并通过OR运算符|沿非捕获组:

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

(?:on|off)将匹配onoff

现在,如果你不喜欢的括号,要在第一组中也抓住了,你可以更改到:

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

。为什么甚至使用捕获器“(上)”还是“(关)”的组? – tenub

+0

@tenub或许OP想要提取这个值以备后用?他们在角色类中使用它,这可能表明需要这个价值。 – Jerry

3

你有你的逻辑或混淆了。

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

应该

\((?:on|off)\) 

[] s为只匹配单个字符。

1

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

1

我认为你的问题可能与方括号[] 它们表示一组单个字符匹配。因此,对于,你只匹配这部分字符串“(上)word1.word2”“()OFN”

:所以,你的表达将匹配任何字符以下的单一实例“字1。 WORD2(”

尝试使用这个来代替:

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

这场比赛假定()将在那里,并查找‘开’或‘关’在括号内

相关问题