这不是做作业!
你好
只是一个关于Regex
格式的问题。
我有不同课程的清单。
L = ['CI101', 'CS164', 'ENGL101', 'I-', 'III-', 'MATH116', 'PSY101']
我正在寻找一种格式,以查找以I
,II
或III
开头的所有单词。这是我所做的。 (我使用python fyi)
for course in L:
if re.search("(I?II?III?)*", course):
L.pop()
我了解到正则表达式中的?
表示可选。因此,我正在考虑将I
,II
和III
设为可选,并将*
包含以下内容。但是,它似乎没有按我的预期工作。什么是更好的工作格式?
谢谢
答案 0 :(得分:3)
这是您应使用的正则表达式:
^I{1,3}.*$
^
表示一行的开头。 I{1,3}
表示重复I
1至3次。 .*
表示任何其他字符串。 $
表示行尾。因此,此正则表达式将匹配以I
,II
或III
开头的所有单词。
先看看您的正则表达式,您没有^
标记,因此它将与I
匹配。其次,?
仅影响前一个字符,因此第一个I
是可选的,但是第二个I
不是可选的,然后第三个I
是可选的,第四个第五个I
不是,第六个I
是可选的。最后,将括号与*
一起使用,这意味着括号中的表达式将重复很多次,包括0次。因此它将匹配0 I
,或至少3 I
。
答案 1 :(得分:1)
您可以使用与字符串开头的模式匹配的函数search()
代替match()
:
import re
l = ['CI101', 'CS164', 'ENGL101', 'I-', 'III-', 'MATH116', 'PSY101']
pattern = re.compile(r'I{1,3}')
[i for i in l if not pattern.match(i)]
# ['CI101', 'CS164', 'ENGL101', 'MATH116', 'PSY101']