我很接近,但我不知道如何处理恢复匹配对象。如果我做
p = re.search('[/@.* /]', str)
我会得到任何以@开头并以空格结尾的单词。这就是我要的。但是这会返回一个我不知道该怎么做的Match对象。查找和返回以@?
为前缀的字符串的计算效率最高的方法是什么例如,
"Hi there @guy"
在做了正确的计算之后,我将被退回
guy
答案 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"
,但这与“并以空格结束”相冲突。
请编辑您的问题,以包含您真正想要/需要匹配的内容。