如何使用Python中的正则表达式标记化示例字符串?

时间:2011-01-29 22:54:00

标签: python regex tokenize lexical-analysis

我是正则表达的新手。除了找出匹配以下字符串的模式之外,还请指出参考和/或示例网站。

数据字符串

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

我希望能够从上面的字符串中提取元组{First1,Last1,20}和{First2,Last2,40}。

3 个答案:

答案 0 :(得分:2)

这里没有必要使用正则表达式:

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]))

答案 1 :(得分:2)

这个似乎没问题: http://docs.python.org/howto/regex.html#regex-howto 只是略过一下,尝试一些例子。正则表达式有点棘手(基本上是一种小编程语言),需要一些时间来学习,但它们非常有用。只需尝试并一步一步。

(是的,我可以给你答案,但鱼,男人,教导)

...

作为reqested,当你不使用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 :(得分:0)

根据Harman的部分解决方案,我提出了这个问题:

(?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')]