Я новачок у python і має питання про використання регулярних виразів на рядках. В даний час я маю:
def find_ips(ip):
ip_str = "bd{1,3}.d{1,3}.d{1,3}.d{1,3}b"
p = re.compile(ip_str)
m = p.match(ip)
if m:
print "match found"
else:
print "no match"
global find_addr
find_addr = p.match(ip)
return find_addr
find_ips("this is an ip 127.0.0.1 10.0.10.5")
print find_addr
Це повертає "не відповідає". Я не бачу те, що я пропустив до цих пір. Я намагаюся вилучити ip-адреси з цього рядка, але спочатку я повинен їх знайти. Використовуючи редактор регулярного виразу, я можу використовувати той самий рядок, щоб знайти ці IP-адреси. Будь-яка допомога цінується.
Відповіді:
1 для відповіді № 1re.match()
матчі з початку рядка, я хотів би використовувати re.findall()
тут, якщо ви хочете зрівняти всіх. Крім того, це найкраща практика використання сирої рядкової позначки з вашим шаблоном.
>>> import re
>>> def find_ips(str):
... m = re.findall(r"b(?:d{1,3}.){3}d{1,3}b", str)
... return ", ".join(m)
...
>>> print find_ips("this is an ip 127.0.0.1 10.0.10.5")
127.0.0.1, 10.0.10.5
2 для відповіді № 2
re.match
лише знайде матч, якщо він знаходиться на початку рядка. re.search
буде шукати весь рядок для матчу.
Крім того, звичайно, хороша ідея використовувати сирі рядки при створенні регулярного виразу:
ip_str = r"bd{1,3}.d{1,3}.d{1,3}.d{1,3}b"
# ^
На трохи незв'язаному ноті:
find_ips("this is an ip 127.0.0.1 10.0.10.5")
print find_addr
є трохи кульда Використання зворотного значення у абонента набагато краще, ніж робити фанки з globals:
print find_ips("...")
0 для відповіді № 3
from re import findall
# The string to be checked.
string = "this is a string 126.32.13.1 with ips in 132.31.3.1 it"
# Print the matches of the regex in the string.
print findall("d+.d+.d+.d+", string)
# Output
# ["126.32.13.1", "132.31.3.1"]