为什么我的正则表达式找不到名字?

时间:2019-01-04 20:15:52

标签: python regex

我正在学习Python,并跟随senddex的视频。我只是去了正则表达式,然后复制了他使用的代码。尽管年龄打印得很好,但是当我尝试打印名称时,我只是得到“ []”作为输出。

import re
examplestring = ''' Jessica is 15 years old, and Daniel is 27 years    old.
Edward is 97, and his grandfather, Oscar, is 102
'''

ages = re.findall(r'\d{1,3}',examplestring)
name = re.findall(r'[A-Z], [a-z]*',examplestring)

print(ages)
print(name)

3 个答案:

答案 0 :(得分:3)

可以使用多种方案来匹配名称。在这种情况下,如果名称是Oscar,则您的正则表达式应如下所示。
正则表达式:[A-Z]应该没有逗号,然后有空格,因为它将尝试找到CoryKramer提到的内容。
[a-z]表示第一个字母是单词,它是大写字母。
+表示从第二个字母开始,所有字母均为小写。

我已经提到*而不是+*+之间的区别是, *至少表示一次,因此如果您的单词只是O,它将不匹配,则您的数据应至少为两个字符,如Os。

*表示零个或多个时间,因此如果您有单词O,它将匹配,因此,如果您的名字是Alphabet的任何字母,它将匹配。因此,如果您认为自己的名字只能是一个字母,请使用+,否则请使用GROUP BY

*的示例:https://regex101.com/r/n9HSIu/1
+的示例:https://regex101.com/r/hL4Pd8/1

答案 1 :(得分:0)

这里的问题是您在编写表达式时使用逗号(,)。

根据它的内容,它会寻找一个大写字母(A-Z),然后是逗号(,),然后是空格,然后是n个不满足您的字符串的字母。

为获得所需的结果,您需要消除逗号(,)并改用它:

name = re.findall(r'[A-Z][a-z]*',examplestring)

答案 2 :(得分:0)

这对于您当前的示例应该适用。在生产环境中,这是行不通的,因为名称可以以小写字母开头,然后不考虑具有FirstName LastName的输入。

import re

examplestring = ''' Jessica is 15 years old, and Daniel is 27 years old.
Edward is 97, and his grandfather, Oscar, is 102 '''

ages = re.findall(r'\d{1,3}',examplestring)
# 
# This regex assumes names will start with 1 capital letter,
# which is followed by lowercase letters. I added the word 
# boundary, because in testing a name like JJessica or JessicA
# will be consider 2 names, which is incorrect.
#
name = re.findall(r'\b[A-Z]{1}[a-z]+\b',examplestring)

print(ages)
print(name)

**OUTPUTS**
['15', '27', '97', '102']
['Jessica', 'Daniel', 'Edward', 'Oscar']