2016-11-11 103 views
1

这是我想要实现的。给定一组数据,我试图获取包含匹配的正则表达式的整行。匹配正则表达式模式,如果存在,否则

从本质上讲,给定的数据集如本

AFAM 002A AFAM & DEV AM HIS/GV 03 46493 3 LEC D2 70 P 20/15 W 1800-2045 08/24/16-12/12/16 WSQ 207 K WHITE 
AFAM 102 AFRO-AMER MUSIC 01 47200 3 LEC P 5/30 W 1800-2045 08/24/16-12/12/16 MUS 250 V GROCE-ROBERTS 
AFAM 125 THE BLACK FAMILY 01 47198 3 LEC P 16/40 M 1800-2045 08/24/16-12/12/16 CCB 101 S MILLNER 
AFAM 152 THE BLACK WOMAN 01 47199 3 LEC P 8/40 T 1800-2045 08/24/16-12/12/16 CL 111 R WILSON 
AFAM 159 ECON ISSUES BLKCM 01 47197 3 LEC P 11/40 MW 1330-1445 08/24/16-12/12/16 CL 234 R WILSON 
AFAM 180 INDIVIDUAL STUDIES 01 46982 3 SUP P 0/10 TBA TBA 08/24/16-12/12/16 

我创建基本上组的以下成..

  1. 课程ID例如正则表达式。 AFAM 002A
  2. 课程名称例如: AFRO-AMER MUSIC
  3. 开始日期
  4. 结束日期
  5. 教授名称(这是我想成为可选的值)

,我现在遇到的问题是,对于可选值,而不是我什么是检查它是否存在,如果不存在则留空。如果有人能告诉我正确的方法来做到这一点,我将不胜感激。

本质上我的正则表达式([A-Z][\s][A-Z]+[-]*[A-Z]+)?的这部分需要包括如果它存在,我明白,这就是?运营商应该如何工作,但我似乎无法使我在这里

找到这个问题的正确的关键字
([A-Z]+[\s][0-9]+[A-Z]*)(.+)[\s][0-9]+[\s][0-9]+.+(\d\d\/\d\d\/\d\d)-(\d\d\/\d\d\/\d\d)[\s]([A-Z][\s][A-Z]+[-]*[A-Z]+)? 

该数据集的最后两行预期的结果应该是

{ [ (AFAM 159), (ECON ISSUES BLKCM), (08/24/16), (12/12/16), (R WILSON)], 
[(AFAM 180), (INDIVIDUAL STUDIES), (08/24/16), (12/12/16),()] 
} 
+0

你想留下什么空的?预期的结果是什么? –

+0

我很抱歉,在编辑中添加了预期结果 –

+0

您的正则表达式在最后一行中与“CL 234”不匹配。试试['([AZ] + \ s \ d + [AZ] *)(。+)\ s \ d + \ s \ d +。+(\ d \ d \ d \ d \ d \ d \ d) - (\ d \ d \/\ d \ d \/\ d \ d)\ S: - '](HTTPS(*([AZ] \ S [AZ] + * [AZ] +)??)?: //regex101.com/r/LjKmw9/1) –

回答

1

你的正则表达式不匹配CL 234在最后一行。你需要消耗它。但是,只需添加.*?将不起作用,您需要使可选模式成为必需模式(删除?)并用可选非捕获组(?:....)包装.*?([A-Z]\s[A-Z]+-*[A-Z]+)

([A-Z]+\s\d+[A-Z]*)(.+?)\s\d+\s\d+.+?(\d\d\/\d\d\/\d\d)-(\d\d\/\d\d\/\d\d)\s(?:.*?([A-Z]\s[A-Z]+-*[A-Z]+))? 

查看regex demo

+0

嗨我正在阅读网站上的文档,我从它得到的是基本上'(?:....)'是一种贪婪的方法,它会寻找一个模式首先匹配该正则表达式,否则它将是空的?我说得对吗? –

+0

一个量词可以是贪婪的,小组可以捕捉或不捕捉,命名或编号。 '(?:PATTERN1PATTERN2 ... PATTERNn)?'使得一系列模式是可选的,但是,由于'?'是贪婪的,它会执行1次或0次。因此,该组内部的模式序列被尝试,并且由于您的模式在组内是泛滥的,所以如果存在,将会被发现,否则,整个组将失败,但由于它是可选的,整个模式将返回匹配。 –