Как токенизировать образец строки, используя регулярное выражение в Python? - PullRequest
0 голосов
/ 30 января 2011

Я новичок в регулярных выражениях. Кроме того, чтобы найти шаблон, соответствующий следующей строке, укажите также ссылки и / или примеры веб-сайтов.

Строка данных

1.  First1 Last1 - 20 (Long Description) 
2.  First2 Last2 - 40 (Another Description)

Я хочу иметь возможность извлекать кортежи {First1, Last1,20} и {First2, Last2,40} из вышеуказанной строки.

Ответы [ 3 ]

2 голосов
/ 30 января 2011

Это кажется нормальным: http://docs.python.org/howto/regex.html#regex-howto Просто просмотрите его, попробуйте несколько примеров.Регулярные выражения немного сложны (в основном это немного язык программирования) и требуют некоторого времени для изучения, но их очень полезно знать.Просто экспериментируйте и делайте один шаг за раз.

(да, я мог бы просто дать вам ответ, но рыба, человек, учите)

...

какзапросил решение, когда вы не используете решение split (): итерируйте по строкам и проверяйте для каждой строки:

p = re.compile('\d+\.\s+(\w+)\s+(\w+)\s+-\s+(\d+)')
m = p.match(the_line)
// m.group(0) will be the first word
// m.group(1) the second word
// m.group(2) will be the firstnumber after the last word.

The regexp is :<some digits><a dot>
<some whitespace><alphanumeric characters, captured as group 0>
<some whtespace><alphanumeric characters, captured as group 1>
<some whitespace><a '-'><some witespace><digits, captured as group 2>

это немного строго, но таким образом вы поймаете несоответствующие линии.

2 голосов
/ 30 января 2011

Здесь нет необходимости использовать регулярные выражения:

foo = "1.  First1 Last1 - 20 (Long Description)"
foo.split(" ")
>>> ['1.', '', 'First1', 'Last1', '-', '20', '(Long', 'Description)']

Теперь вы можете выбрать понравившиеся элементы (они всегда будут иметь одинаковые индексы).

В 2.7+ выможно использовать itertools.compress для выбора элементов:

tuple(compress(foo.split(" "), [0,0,1,1,0,1]))
0 голосов
/ 30 января 2011

Основываясь на частичном решении Хармана, я придумал следующее:

(?P<first>\w+)\s+(?P<last>\w+)[-\s]*(?P<number>\d[\d,]*)

код и вывод:

>>> regex = re.compile("(?P<first>\w+)\s+(?P<last>\w+)[-\s]*(?P<number>\d[\d,]*)")
>>> r = regex.search(string)
>>> regex.findall(string)
[(u'First1', u'Last1', u'20'), (u'First2', u'Last2', u'40')]
...