поиск и возврат строки с указанным префиксом - PullRequest
1 голос
/ 02 июня 2010

Я близко, но я не уверен, что делать с повторяющимся объектом сопоставления. Если я сделаю

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

Я получу любые слова, которые начинаются с @ и заканчиваются пробелом. Это то, что я хочу. Однако это возвращает объект Match, с которым я не знаю, что делать. Каков наиболее эффективный в вычислительном отношении способ поиска и возврата строки с префиксом @?

Например,

"Hi there @guy"

После выполнения правильных вычислений мне будет возвращено

guy

Ответы [ 6 ]

3 голосов
/ 02 июня 2010

Следующее регулярное выражение делает то, что вам нужно:

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 голос
/ 02 июня 2010

Это регулярное выражение не делает то, что вы думаете.

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, без юникода и т. Д.).

0 голосов
/ 03 июня 2010

Вы говорите: "" "Если я сделаю p = re.search('[/@.* /]', str) Я получу любые слова, которые начинаются с @ и заканчиваются пробелом." "Но это неверно - этот шаблон является классом символов, который будет соответствовать ОДИН символ в наборе @/.* и пробел. Примечание: в шаблоне есть лишняя секунда /. Например:

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

Вы говорите, что хотите, чтобы "guy" вернулось из "Hi there @guy", но это противоречит "и заканчивается пробелом".

Пожалуйста, измените ваш вопрос, чтобы включить то, что вы действительно хотите / должны соответствовать.

0 голосов
/ 02 июня 2010

Как видно из ответов, regex является наиболее эффективным решением вашей проблемы. Ответы немного отличаются в зависимости от того, что вы позволяете следовать @:

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

Если вы лучше представляете, какие символы могут быть включены в имя пользователя, вы можете настроить регулярное выражение так, чтобы оно отображалось, например, только строчными буквами ascii:

[a-z]

Примечание: я пропустил квантификаторы для простоты.

0 голосов
/ 02 июня 2010
(?<=@)\w+

будет соответствовать слову, если ему предшествует @ (без добавления его к совпадению, так называемый положительный взгляд сзади). Это будет соответствовать «словам», которые состоят из букв, цифр и / или подчеркивания; если вы не хотите, используйте (?<=@)[^\W\d_]+

В Python:

>>> strg = "Hi there @guy!"
>>> p = re.search(r'(?<=@)\w+', strg)
>>> p.group()
'guy'
0 голосов
/ 02 июня 2010

p.group(0) должен вернуть guy. Если вы хотите узнать, какую функцию имеет объект, вы можете использовать метод dir(p), чтобы узнать Это вернет список атрибутов и методов, доступных для этого экземпляра объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...