为什么我的forloop不能匹配我定义的任何正则表达式?

2024-09-30 14:26:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我们刚刚开始学习正则表达式,但是当我尝试使用正则表达式进行搜索时,无法在字符串中找到任何匹配项。我做错什么了?你知道吗

我创建了六个单独的字符串(只是为了看起来),并将它们连接成一个字符串,然后我尝试循环遍历拆分字符串中的单词,并搜索我声明的一个正则表达式

下面,我翻译了右边的字符串,让你知道它说了什么。你知道吗

myString1 = "Skal vi moetes neste torsdag?" # - Shall we meet next Thursday 
myString2 = "Hva med aa heller moetes mandag?" # - How about Monday
myString3 = "Hvordan gikk moetet forrige mandag?" # - How did the meeting on monday go?
myString4 = "Det gikk bra, vi skal moetes igjen tirsdag onsdag fredag lørdag søndag 13. september." # - It went well, we are meeting again on Sunday September 13th.
myString5 = "Altsaa, 13/09/2014?" 
myString6 = "Ja, Sunday 13. september 2014." # - Yes, Sunday, September 13th 2014

myStringAll = (myString1 + myString2 + myString3 + myString4 + myString5 + myString6)
myWords = myStringAll.split()

regWeekDays = re.compile(r'^(man|tirs|ons|tors|fre|lør|søn)dag$', re.IGNORECASE)
regNextLast = re.compile(r'^[neste].$', re.IGNORECASE)
regDay = re.compile(r'^([0-2][0-9]|3[0-1])$')
regYear = re.compile(r'^([1-2][0-9][0-9][0-9])$')

for words in myWords:
    matches = re.findall(regNextLast, words)
    if matches:
        print words

Tags: 字符串rehowweviwordscompilesunday
2条回答

r'^[neste].$'可能不是你的意思。此正则表达式查找长度为两个字符的字符串,其中第一个字符是in ('e', 'n', 's', 't'),后跟任何其他单个字符。从较大的字符串中拆分出来的两个字符子字符串都不符合此模式。你知道吗

也许你可以从教程中受益:http://www.regular-expressions.info/tutorial.html

正则表达式有几个问题,但主要的问题是在每个表达式的开头和结尾使用^$^表示匹配字符串的开头,$表示匹配字符串的结尾。除非字符串的长度与表达式的长度严格匹配,findall将不会匹配任何内容。你知道吗

一个例子:

In [55]: re.findall(r'^a$', 'abcdefghijkl')
Out[55]: [] # "a" is not matched!

^$应分别用于显式匹配字符串的开头和结尾(或在某些情况下,请参见documentation)。去掉这些,你的表达式就应该开始匹配了。你知道吗

以下是一些更具体的问题:

  • ^(man|tirs|ons|tors|fre|lør|søn)dag$中,findall只捕获并返回第一部分(man|tirs|ons|tors|fre|lør|søn)。将其更改为non capturing group,以便返回整个表达式:

    (?:man|tirs|ons|tors|fre|lør|søn)dag

  • ^[neste].$中,我假设您想要捕获字符串"neste"。当前您有一个集[neste],它将匹配以下字符中的一个:nest。将其更改为neste
    关于集合的文档可以在here中找到。你知道吗
  • ^([0-2][0-9]|3[0-1])$基本上是好的,除了^$,您可以省略01之间的连字符,排除括号,并使用数字符号\d(相当于[0-9],但是:

    ^{

  • 最后,在'^([1-2][0-9][0-9][0-9])$'(同样,除了^$)中,表达式应该像预期的那样工作,但是您可以使它更加简洁。可以使用curly bracket syntax指定重复。因此,匹配1000-2999之间任何年份的字符串变为:

    [12]\d{3}

我建议你仔细阅读HOWTO on Regular Expressions。你知道吗

相关问题 更多 >