Python 为什么赢了';我的for循环与我定义的任何正则表达式都不匹配吗?
我们刚刚开始学习正则表达式,但是当我尝试使用正则表达式进行搜索时,无法在字符串中找到任何匹配项。我做错了什么 我创建了六个单独的字符串(只是为了看起来),并将它们连接成一个字符串,然后尝试循环遍历拆分字符串中的单词并搜索我声明的一个正则表达式 下面,我翻译了右边的字符串,让你知道它是怎么说的Python 为什么赢了';我的for循环与我定义的任何正则表达式都不匹配吗?,python,regex,for-loop,printing,Python,Regex,For Loop,Printing,我们刚刚开始学习正则表达式,但是当我尝试使用正则表达式进行搜索时,无法在字符串中找到任何匹配项。我做错了什么 我创建了六个单独的字符串(只是为了看起来),并将它们连接成一个字符串,然后尝试循环遍历拆分字符串中的单词并搜索我声明的一个正则表达式 下面,我翻译了右边的字符串,让你知道它是怎么说的 myString1 = "Skal vi moetes neste torsdag?" # - Shall we meet next Thursday myString2 = "Hva med aa he
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
r'^[neste].$”
可能不是你的意思。此正则表达式查找长度为两个字符的字符串,其中第一个字符是('e','n','s','t')中的,后跟任何其他单个字符。从较大字符串中拆分出的两个字符子字符串都不符合此模式
也许您可以从教程中受益:正则表达式有几个问题,但主要问题是在每个表达式的开头和结尾使用^
和$
^
表示匹配字符串的开头,$
匹配字符串的结尾。除非字符串的长度与表达式的长度严格相同,findall
将不匹配任何内容
一个例子:
In [55]: re.findall(r'^a$', 'abcdefghijkl')
Out[55]: [] # "a" is not matched!
^
和$
应分别用于显式匹配字符串的开头和结尾(在某些情况下,或行的结尾,请参阅)。去掉这些,表达式应该开始匹配
以下是一些更具体的问题:
- 在《代码》中,findall将只捕获并返回第一部分(
man | tirs | ons | tors | fre | l|r | s| n
)。将此更改为a,以便返回整个表达式:
(?:man | tirs | ons | tors | fre | r | s|n)dag
- 在
^[neste].$
中,我假设您想要捕获字符串“neste”
。当前,您有一个集合[neste]
,该集合将匹配以下字符之一:n
、e
、s
或t
。将此更改为simplyneste
可以找到有关集合的文档
^([0-2][0-9]| 3[0-1])$
基本没问题,除了^
和$
之外,您可以省略0
和1
之间的连字符,排除括号,并使用数字符号\d
(相当于[0-9]
,但是:
[0-2]\d]3[01]
- 最后,在
“^([1-2][0-9][0-9][0-9])$”
,(同样,除了^
和$
)之外,表达式应该按预期工作,但您可以使其更简洁。您可以使用指定重复。因此,匹配1000-2999之间任何年份的字符串变为:
[12]\d{3}
我建议您仔细阅读。的r'^[neste]的含义“$”
是将任何字符“n”、“e”、“s”、“t”后跟另一个字符进行匹配。我认为您还没有真正理解正则表达式。请注意:您在源代码中定义字节字符串,但没有指定编码。如果您是从文件加载字符串,您也将加载编码字节字符串,并且不能保证r正则表达式将在同一个编解码器中包含字节。请改用Unicode值;请参阅。声明您的源代码编解码器,使用Unicode值并解码文件内容。谢谢!这并不是问题所在,但您帮助我找到了错误。非常感谢!非常非常有用!!