2011-09-25 89 views
1

我被困在转储:这个简单的正则表达式有什么问题?

import re 
print re.search('return[^$]+', 
       'return to the Treasury of $40 million\nnow!').group(0) 

上述正则表达式只能打印return to the Treasury of,但我希望它包括$40 million。我从正则表达式理解的是,我要求它到take every thing until the end of the line

我不想使用.*,我想要endline delimiter直到从某点结束。如果我从搜索字符串中删除$,它会打印完整的字符串。为什么与美元符号匹配的endline分隔符?

+1

你真的测试过'return。+'或'return。+ $'为正则表达式吗?因为它听起来像那些会做你想要的。 –

回答

3
return[^$]+ 

将匹配字符串“回归”之后,是不是“$”一次或多次的任何字符。

这是因为[]意味着字符组和内部[]中的特殊字符作为简单字符进行线程化。

因此它只匹配到美元符号。

为什么不使用:

return.+$ 

这正是你想要的。

+0

好吧,我明白这一点,我如何告诉正则表达式在'charater class []'中使用'''将它解释为'end line delimiter'而不是'dollar character',因为我们也使用'[^ ​​\ d +]'这里我们告诉regix去任何数字,为什么它不把'd'解释为'字母d'呢?如果我使用'[^ ​​\ $] +'正则表达式仍然将'$'解释为字符:s –

+0

只有在使用re.MULTILINE时,否则$表示字符串结束。 –

+0

'。+ $'似乎也在工作,但是我已经使用了[[s \ S] + $'这很好,谢谢 –

0

为什么你不想使用.*

您拥有的正则表达式将匹配任何以“return”开头的字符串,然后匹配一个或多个不是“$”字符的字符。请注意,这不会查找行尾标记。

return.*$将匹配一切直至包括行标记的末尾。如果您正在处理多行输入,您可能(但可能不需要)使.*成为懒惰匹配器。

+0

我不想使用'。*'因为我的字符串是多行的,我可以使用'[\ s \ S] +?'但我不知道该停在哪里。例如如果你在上面的字符串中使用这个正则表达式'return [\ s \ S] +?',它将只打印返回 –

+0

@Aamir - 尝试没有'?'。如果使用re.MULTILINE, –

+0

$只会匹配行尾。 –

0
import re 
text = 'we will return to the Treasury of $40 million\nunits of money.' 
re.search(r'return.*$', text, re.MULTILINE).group(0) 

# prints 'we will return to the Treasury of $40 million' 

您需要包含多行标志,那么$将在换行符处匹配。

相关问题