парсинг слов в строке с предваряющим паролем с помощью регулярного выражения - PullRequest
0 голосов
/ 11 марта 2010
a="aaaaaa password: GOD hello world password is G0D hello"
match = re.match("^(?:.*(?:password\sis\s|password:\s)([a-zA-Z]*)\s.*)*$",a)

print match.groups()

Я хочу, чтобы вывод был ('GOD', 'G0D'), но все, что я получил, это ('G0D') Я пытаюсь решить это только с помощью Regex. количество раз, когда «пароль» может появиться в тексте, может варьироваться. помощь будет очень ценится.

Ответы [ 3 ]

1 голос
/ 11 марта 2010

Я бы использовал re.findall и немного упростил бы регулярное выражение.

>>> re.findall(r"(?:password\sis\s+|password\:\s+)(\S+)", a)
['GOD', 'G0D']

Редактировать: изменено с \ w на \ S для того, чтобы также захватить знаки препинания и удалить выражение списка.

0 голосов
/ 11 марта 2010

Я думаю, вам нужно будет сопоставить первое вхождение, а затем продолжить сопоставление возможных новых вхождений, используя функцию global matching Pyhon (не знаю, как это сделать, я очень мало знаю Python)

В PHP, например, мы можем использовать preg_match_all для решения этой проблемы:

$a="aaaaaa password: GoD hello world password is G0D hello";
if(preg_match_all('/.*?(?:password\sis\s|password:\s)(\w+)/',$a,$matches)) {
    var_dump($matches[1]); // prints God and GOD
}
0 голосов
/ 11 марта 2010

Обычное подвыражение ([a-zA-Z]*) не принимает цифры, возможно, вы имели в виду ([a-zA-Z0-9]+) или другой вариант будет (\S+).

Вы уже использовали \s, знаете ли вы \S? Поскольку вы используете \s в качестве «разделителя» вашего токена пароля, вы также можете быть последовательным и определять пароль как состоящий из любых символов, которые не разделители.

Вы также можете упростить ваше регулярное выражение в целом следующим образом:

^(?:.*:password(\sis|:)\s(\S+)\s.*)*$

Как указывает аналогия codaddict с PHP preg_match_all, вам также необходимо вызвать re.findall. Для этого вам нужно изменить регулярное выражение на такое, которое не перекрывается, например:

password(\sis|:)\s(\S+)

и затем вы получите в возвращаемом значении от re.findall () список совпадений, каждое из которых состоит из списка сопоставляемых групп.

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