我正在学习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)
答案 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']