2010-06-02 64 views
1

我很接近,但我不知道如何处理restuling匹配对象。如果我做查找并返回一个带有指定前缀的字符串

p = re.search('[/@.* /]', str) 

我会得到任何以@开头的单词,并以空格结束。这就是我要的。然而,这会返回一个Match对象,我不知道该怎么处理。查找和返回以@为前缀的字符串的计算最有效的方法是什么?

例如,

"Hi there @guy" 

做正确的计算后,我将返回

guy 

回答

3

下面的正则表达式你所需要的:

import re 
s = "Hi there @guy" 
p = re.search(r'@(\w+)', s) 
print p.group(1) 

它还将用于以下字符串格式的工作:

  • s = "Hi there @guy "#注意到尾随空间
  • s = "Hi there @guy,"#注意到尾随逗号
  • s = "Hi there @guy and"#注意下一个字
  • s = "Hi there @guy22"#注意到尾随数字
  • s = "Hi there @22guy"#通知领先的数字,如果它是由一个@(之前
+0

取决于是否让我们见面@ 11 pm应该得到匹配 – 2010-06-02 10:19:54

+0

如果数字是重要的(以及单词)该正则表达式将如何修改? – tipu 2010-06-02 17:57:56

+0

其实\ w模式匹配任何字母数字字符和下划线,这相当于set [a-zA-Z0-9_],例如@ 11pm,例如会正确匹配。 – 2010-06-03 06:30:45

0

p.group(0)应该返回guy。如果你想知道对象有什么功能,你可以使用dir(p)方法找出。这将返回可用于该对象实例的属性和方法的列表。

+0

似乎并不, '>>> STR = “乔有@guy” >>> P = re.search( '[/@.* /]',STR) >>> p .group(0) ''' (输出为'') – tipu 2010-06-02 09:33:01

+0

我会补充一点,您可以在http://docs.python.org/library/re.html#match找到匹配对象的文档。 -objects – 2010-06-02 09:34:45

1

该正则表达式不会做你认为它的作用。

s = "Hi there @guy" 
p = re.search(r'@([^ ]+)', s) # this is the regex you described 
print p.group(1) # first thing matched inside of (..) 

但作为一般用正则表达式,有吨的违反此,例如,如果文本为s = "Hi there @guy, what's with the comma?"结果将是guy,例子。

所以你真的需要考虑你想要的每一件可能的事情,并且不想匹配。 r'@([a-zA-Z]+)'可能是一个很好的起点,它实际上只匹配字母(a .. z,没有unicode等)。

+0

您可以使用'\ b'。 – kennytm 2010-06-02 09:40:24

0
(?<[email protected])\w+ 

将匹配一个单词不将其加入了比赛,所谓的积极的回顾后)。这将匹配由字母,数字和/或下划线组成的“单词”;如果你不想这些,使用(?<[email protected])[^\W\d_]+

在Python:

>>> strg = "Hi there @guy!" 
>>> p = re.search(r'(?<[email protected])\w+', strg) 
>>> p.group() 
'guy' 
0

由于这是从答案显然到目前为止正则表达式是你的问题的最有效的解决方案。答案略有不同关于你给多少所应遵循的@

[^ ] anything but space 
\w in python-2.x is equivalent to [A-Za-z0-9_], in py3k is locale dependent 

如果你有更好的想法可能会被包含在用户名什么字你会调整自己的正则表达式来反映,例如,只有小写ASCII字母,将是:

[a-z] 

注:为简单起见,我跳过量词。

0

你说:“”“如果我这样做p = re.search('[/@.* /]', str)我会得到任何以@开始的单词,并以空格结束。”“但这是不正确的 - 该模式是一个匹配一个字符的字符类。在设置@/.*和空间注意:有一个在模式的冗余的第二/ 例如:

>>> re.findall('[/@.* /]', '[email protected] x/x.x*x xxxx') 
['@', ' ', '/', '.', '*', ' '] 
>>> 

你说你要"guy""Hi there @guy"返回,但以“和以空间结束了”冲突。

请编辑你的问题,包括你真正想要/需要匹配的东西。

相关问题