这是我第一次在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 (
而不是我正在寻找的整个表达。你能不能给我一个提示我做错了什么?
答案 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)
将匹配on
或off
现在,如果您不喜欢括号,要在第一组中被捕获,您可以将其更改为:
\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”。