我是正则表达的新手。除了找出匹配以下字符串的模式之外,还请指出参考和/或示例网站。
数据字符串
1. First1 Last1 - 20 (Long Description)
2. First2 Last2 - 40 (Another Description)
我希望能够从上面的字符串中提取元组{First1,Last1,20}和{First2,Last2,40}。
答案 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')]