Regex 在Python3正则表达式findall中匹配多个OR条件
在python 3中: 这是外国资产管制办公室的名单,应在其中监测个人资产 他们的许多出生数据(最后一列,逗号分隔)如下Regex 在Python3正则表达式findall中匹配多个OR条件,regex,python-3.x,findall,Regex,Python 3.x,Findall,在python 3中: 这是外国资产管制办公室的名单,应在其中监测个人资产 他们的许多出生数据(最后一列,逗号分隔)如下 DOB 23 Jun 1959; alt. DOB 23 Jun 1958 或 我试图用以下代码捕获关键字“DOB”和“alt.DOB”后的所有生日: if len(x.split(';')) > 0: if len(re.findall('DOB (.*)', x.split(';')[0])) > 0: new
DOB 23 Jun 1959; alt. DOB 23 Jun 1958
或
我试图用以下代码捕获关键字“DOB”和“alt.DOB”后的所有生日:
if len(x.split(';')) > 0:
if len(re.findall('DOB (.*)', x.split(';')[0])) > 0:
new = re.findall('DOB | alt. DOB (.*)', x.split(';')[0])[0]
print(new)
try:
print(datetime.strptime(new, '%d %b %Y'))
return datetime.strptime(new, '%d %b %Y')
except:
return None
但是这些代码只在“出生日期”之后获得出生日期,而不包括“出生日期”之后的出生日期。不知道我怎么做?谢谢。您可以使用
(?您可以匹配DOB
并为日期部分使用捕获组。对于日期部分,天数和月份可以是可选的,后跟匹配的4位数字
日期部分模式不会验证日期本身,它使匹配更加具体
\bDOB ((?:(?:3[01]|[12][0-9]|0?[1-9]) [A-Za-z]+ )?\d{4})\b
解释
\bDOB
按字面意思匹配前面的单词边界
(
捕获组1
(?:
非捕获组
(?:3[01]|[12][0-9]|0?[1-9])[A-Za-z]+
匹配数字1-31和1+字符A-Za-z
)?
关闭组并将其设置为可选
\d{4}
匹配4位数字
)\b
关闭第1组,后跟单词边界
|
例如:
import re
regex = r"\bDOB ((?:(?:3[01]|[12][0-9]|0?[1-9]) [A-Za-z]+ )?\d{4})\b"
test_str = ("DOB 23 Jun 1959; alt. DOB 23 Jun 1958\n"
"DOB 1959; alt. DOB 1958")
print(re.findall(regex, test_str))
输出
['23 Jun 1959', '23 Jun 1958', '1959', '1958']
你好@第四只鸟,如果我想捕捉“1958年6月,我如何修改正则表达式?谢谢。“regex=r”\bDOB((?:(?:3[01]|[12][0-9]| 0[1-9])?:[A-Za-z]+)\d{4})\b”“这将只返回['1959',1958'.@Chubaka在这种情况下,您可以选择月份的数字部分
['23 Jun 1959', '23 Jun 1958']
['1959', '1958']
\bDOB ((?:(?:3[01]|[12][0-9]|0?[1-9]) [A-Za-z]+ )?\d{4})\b
import re
regex = r"\bDOB ((?:(?:3[01]|[12][0-9]|0?[1-9]) [A-Za-z]+ )?\d{4})\b"
test_str = ("DOB 23 Jun 1959; alt. DOB 23 Jun 1958\n"
"DOB 1959; alt. DOB 1958")
print(re.findall(regex, test_str))
['23 Jun 1959', '23 Jun 1958', '1959', '1958']