正则表达式格式以从列表中查找特定的字符串

时间:2019-03-20 02:55:13

标签: python regex

这不是做作业!

你好

只是一个关于Regex格式的问题。

我有不同课程的清单。

L = ['CI101', 'CS164', 'ENGL101', 'I-', 'III-', 'MATH116', 'PSY101']

我正在寻找一种格式,以查找以IIIIII开头的所有单词。这是我所做的。 (我使用python fyi)

for course in L:
    if re.search("(I?II?III?)*", course):
        L.pop()

我了解到正则表达式中的?表示可选。因此,我正在考虑将IIIIII设为可选,并将*包含以下内容。但是,它似乎没有按我的预期工作。什么是更好的工作格式?

谢谢

2 个答案:

答案 0 :(得分:3)

这是您应使用的正则表达式:

^I{1,3}.*$

click here to see example

^表示一行的开头。 I{1,3}表示重复I 1至3次。 .*表示任何其他字符串。 $表示行尾。因此,此正则表达式将匹配以IIIIII开头的所有单词。

先看看您的正则表达式,您没有^标记,因此它将与I匹配。其次,?仅影响前一个字符,因此第一个I是可选的,但是第二个I不是可选的,然后第三个I是可选的,第四个第五个I不是,第六个I是可选的。最后,将括号与*一起使用,这意味着括号中的表达式将重复很多次,包括0次。因此它将匹配0 I,或至少3 I

your regex

答案 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']