<p>两种方式:</p>
<ol>
<li><p>使用一个正则表达式并使用|运算符将所有事例连接在一起:</p>
<p><code>expr = re.compile ( r"expr1|expr2|expr3" )</code></p></li>
<li><p>只查找单个实例,然后为下一次搜索传递“起始位置”。请注意,这将使事情复杂化,因为无论选择哪种格式,您总是希望从最早的匹配开始。也就是说,循环所有三个匹配项,找出最早的匹配项,进行替换,然后以递增的起始位置再次进行。这使得选项1变得更加容易。</p></li>
</ol>
<p>另外几点:</p>
<ol>
<li><p>确保使用的是“原始字符串”:在每个字符串的前面加一个“r”。否则“\”字符可能会被吃掉,而不会传递给RE引擎</p></li>
<li><p>考虑使用“sub”和回调函数代替“repl”参数来进行替换,而不是finditer在这种情况下,“repl”被传递一个匹配对象,并且应该返回替换字符串。</p></li>
<li><p>如果未选择备选方案,则“单一”re中的匹配组将具有值None,这样可以很容易地检测使用了哪个备选方案。</p></li>
<li><p>除非您打算修改该变量,否则不应该说“global”。</p></li>
</ol>
<p>下面是一些完整的工作代码。你知道吗</p>
<pre><code>#!/usr/bin/env python
# -*- coding: utf-8 -*-
import re
expr = re.compile(
r'(?P<day1>\d{1,2})/(?P<month1>\d{1,2}) -(?P<year>\d{2})|(?P<day2>\d{1,2})/(?P<month2>\d{1,2})|(?P<year3>\d{4})-(?P<month3>\d{2})-(?P<day3>\d{2})')
def get_dates(datestring):
"""Try to extract all dates from certain strings.
Arguments:
- `datestring`: A string containing dates.
"""
found_dates = []
matches = expr.finditer(datestring)
for match in matches:
if match.group('day1'):
found_dates.append({'day': match.group('day1'),
'month': match.group('month1') })
elif match.group('day2'):
found_dates.append({'day': match.group('day2'),
'month': match.group('month2')})
elif match.group('day3'):
found_dates.append({'day': match.group('day3'),
'month': match.group('month3'),
'year': match.group('year3')})
else:
raise Exception("wtf?")
return found_dates
if __name__ == '__main__':
dates = get_dates('1/2 -13, 5/3 & 2012-11-22')
for date in dates:
print date
</code></pre>