2013-05-22 2 views
1

Чтобы дать вам идею, я пытаюсь выполнить захват любой строки этой информацией.Попытка понять более простой способ с RegEx

IP Address for: John Doe on 05/20/13 

я в основном нужно найти все строки в этом формате ..

Я использую date '+%m/%d/%y', чтобы захватить дату на сегодняшний день.

По сути мне нужно:

"'IP Address for: '[A-Za-z]'on 'date ''+%m/%d/%y''" 

EDIT:

Пример Струны

IP Address for: John Doe on 05/20/13 
another random string 
IP Address for: Jane Doe on 05/20/13 
IP Address for: John Appleseed on 05/20/13 
random string 
IP Address for: Mr. Beans on 05/14/13 
IP Address for: Steve Jobs on 05/03/13 
IP Address for: Bill Gates on 05/19/13 

Что мне нужно вернулся бы это. Это соответствует критериям, имеющим «IP-адрес для:„+“на„+“date»

IP Address for: John Doe on 05/20/13 
IP Address for: Jane Doe on 05/20/13 
IP Address for: John Appleseed on 05/20/13 
+0

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

+0

Я пошел вперед и добавил примеры. – Matthew

+0

Я пошел вперед и дал вам хороший метод. –

ответ

1

Я написал хороший метод для вас.

import re 

s = ''' 
IP Address for: John Doe on 05/20/13 
another random string 
IP Address for: Jane Doe on 05/20/13 
IP Address for: John Appleseed on 05/20/13 
random string 
IP Address for: Mr. Beans on 05/14/13 
IP Address for: Steve Jobs on 05/03/13 
IP Address for: Bill Gates on 05/19/13 
''' 

regex = re.compile(r'IP Address for: (.+) on (\d\d/\d\d/\d\d)') 

def method(data, matcher, name=None, date=None): 
    ''' 
    Takes data and runs the matcher on it to find name and date. 
    ARGS: 
    data := the data (string, or fileobject) 
    matcher := the regex object to match with. 
    name := specify only specific name to find (optional) 
    date := specify only specific date to find (optional) 
    ''' 
    if isinstance(data, str): 
     content = data.split('\n') 
    elif isinstance(data, file): 
     content = data 
    for line in content: 
     line = line.strip() 
     ms = matcher.match(line) 
     if not ms: 
      continue 
     if name and ms.group(1) != name: 
      continue 
     if date and ms.group(2) != date: 
      continue 
     yield ms.groups() 

С его помощью:

# no options 
for result in method(s, regex): 
    print result 

('John Doe', '05/20/13') 
('Jane Doe', '05/20/13') 
('John Appleseed', '05/20/13') 
('Mr. Beans', '05/14/13') 
('Steve Jobs', '05/03/13') 
('Bill Gates', '05/19/13') 

# with a name 
for result in method(s, regex, name='John Doe'): 
    print result 

('John Doe', '05/20/13') 

# with a date 
for result in method(s, regex, date='05/20/13'): 
    print result 

('John Doe', '05/20/13') 
('Jane Doe', '05/20/13') 
('John Appleseed', '05/20/13') 
0

Если формат всегда заперт к этому, вы можете искать шире по названию. Вы также можете пойти очень общего в соответствии с датой, если вам не нужна проверка.

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

Пример соответствия для строки,

IP Address for: John Doe on 05/20/13 

может быть следующее регулярное выражение:

1. 
IP Address for: .+ on (\d\d/\d\d/\d\d) 

Это поможет вам дату в 1-й группе, но это позволит любому персонажу быть используется для имени и позволяет использовать любое число для дат. Если вы хотите ограничить, какие символы разрешены, вы можете сделать это путем замены, что с группой характеров, как вы были в вашем примере:

[A-Za-z]+ 

Проблема с этой группой характеров в том, что вы не можете соответствовать пробелы и он не будет работать для John Doe. Для того, чтобы соответствовать пространство между именами, вам необходимо либо включить, что в группе символов

2. 
[A-Za-z\s]+ 

или сопоставления нескольких слов.

3. 
([A-Za-z]+\s?)+ 

Преимущество последнего один здесь, является то, что он не признает тот случай, когда нет никакого имени, или имя не содержит A-Z символов.

Несколько примеров:

IP Address for: .$%1 on 05/20/13  matches 1. 
IP Address for: on 05/20/13   matches 1. and 2. 
IP Address for: John Doe on 05/20/13 matches 1., 2. and 3. 

Поэтому в зависимости от того, как вход выглядит, вы можете избежать регулярных выражений с .* в них. Люди используют их все время, и обычно это нормально работает, но я стараюсь никогда не использовать точку, если я не могу найти другого пути.

0

Учитывая ваше упоминание о date, я предполагаю, что вам нужны только строки, соответствующие сегодняшней дате, в любую дату, когда вы делаете чек.

$ grep "IP Address for: .* on $(date +'%m/%d/%Y')" file.txt 
1

Для AppleScript тега:

set myText to "Starting Text 
IP Address for: Mr. Beans on 05/14/13 
Leading Text IP Address for: Steve Jobs on 05/03/13 Trailing Text 
Middle Text 
IP Address for: Bill Gates on 05/19/13 
Ending Text 
" 

set variableName to do shell script "grep -Eo 'IP Address for:.*on ([[:digit:]]{2}/){2}[[:digit:]]{2}' <<< " & quoted form of myText 
Смежные вопросы