查找并返回具有指定前缀的字符串

时间:2010-06-02 09:21:58

标签: python regex string

我很接近,但我不知道如何处理恢复匹配对象。如果我做

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

我会得到任何以@开头并以空格结尾的单词。这就是我要的。但是这会返回一个我不知道该怎么做的Match对象。查找和返回以@?

为前缀的字符串的计算效率最高的方法是什么

例如,

"Hi there @guy"

在做了正确的计算之后,我将被退回

guy

6 个答案:

答案 0 :(得分: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"#注意前导数字

答案 1 :(得分: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等)。

答案 2 :(得分:0)

p.group(0)应该返回guy。如果要查找对象具有哪些功能,可以使用dir(p)方法查找。这将返回可用于该对象实例的属性和方法列表。

答案 3 :(得分:0)

(?<=@)\w+

将匹配一个单词,如果它前面有一个@(没有将它添加到匹配中,即所谓的正向lookbehind)。这将匹配由字母,数字和/或下划线组成的“单词”;如果您不想要这些,请使用(?<=@)[^\W\d_]+

在Python中:

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

答案 4 :(得分:0)

从答案中可以看出,到目前为止,正则表达式是解决问题的最有效方法。关于@

允许遵循的内容,答案略有不同
[^ ] anything but space
\w   in python-2.x is equivalent to [A-Za-z0-9_], in py3k is locale dependent

如果您更好地了解用户名中可能包含哪些字符,则可以调整正则表达式以反映该字符,例如,只有小写字母ascii字母:

[a-z]

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

答案 5 :(得分:0)

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

>>> re.findall('[/@.* /]', 'xxx@foo x/x.x*x xxxx')
['@', ' ', '/', '.', '*', ' ']
>>>

您说您希望从"guy"返回"Hi there @guy",但这与“并以空格结束”相冲突。

请编辑您的问题,以包含您真正想要/需要匹配的内容。