Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在Python3正则表达式findall中匹配多个OR条件_Regex_Python 3.x_Findall - Fatal编程技术网

Regex 在Python3正则表达式findall中匹配多个OR条件

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

在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 = 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']