正则表达式

时间:2016-10-24 22:54:04

标签: python regex

这里的第一次海报。我不擅长编程,但我正在努力。我已经获得了Python类的作业,我的任务是:

  • 您需要考虑从键盘读入的行中搜索的三个单词。这三个词是你的名字,你最喜欢的颜色,也是你最喜欢的季节。

  • 您的程序会提示用户输入一行,然后您将使用正则表达式搜索每行的单词。即使案例与您通常使用的案例混合或不同,您也希望找到这些词。

  • 如果你找到你的名字,你应该打印出输出,“嘿,我的名字是NAME。”用NAME替换了所输入的内容(包括案例)。

  • 如果你找到自己喜欢的颜色,你应该打印出输出,“哦,我喜欢颜色颜色。”将COLOR替换为所输入的内容(包括大小写)。

  • 如果你找到自己喜欢的季节,你应该打印输出,“我确实认为季节是最好的季节。”将SEASON替换为所输入的内容(包括案例)。

这是我迄今为止所尝试过的:

import re

input = raw_input("Please input a sentence stating your name, your favorite color, and your favorite season: ")

x = "My name is DoTNeT."
name = input.split(",")[1]
z = re.search(name, x)

if z == None:
    pass
else:
    print x 

我认为我在这里有正确的想法...我知道它不对,我只是感到沮丧,因为我还在学习Python,随之而来的是学习如何谈论它。我不知道如何准确地说出我为什么错了或者我需要如何解决它。我不是在寻找一个只为我答复的人,我想了解它。一切都有帮助。感谢。

2 个答案:

答案 0 :(得分:0)

正如您所提到的,您只需要建议而非实际代码(我喜欢它)。以下是您可能会发现有用的一些内容:

  • 使用string.split()将字符串拆分为单词(Tutorial link

  • re.search()检查子字符串,re.sub()替换字符串。 例如:your_word会将字符串中的your_word检查为:

    >>> import re
    >>> if re.search('hello', 'yes hello world'):
    ...    print 'match'
    ...
    match  # prints match as "hello" is present in "yes hello world"
    

请阅读:Regular Expression Syntax文件。特别re.IGNORECASE用于不区分大小写的搜索。

答案 1 :(得分:0)

您可以使用圆括号和管道来设置与列表中的任何单词匹配的模式。您可以使用它来匹配季节和颜色:

seasons = "(winter|spring|summer|fall)"
colors = "(red|white|black|yellow|pink|brown|green|blue|purple|cyan)"

正如已经提到的那样,您可以使用标志re.IGNORECASE将模式与所写的大小写进行匹配。例如,对于季节:

match = re.search("(winter|spring|summer|fall)", "i like SumMer")
print match.group()
# SumMer

在这里,我正在使用i like SumMer字符串上的季节模式进行search。由于存在匹配项,因此它返回一个MatchObject,而我正在对其进行group来获得我的组匹配项,即SumMer。如果没有匹配项,则match将是None

如果您不知道我所说的组的含义,简单地说,当您的模式中带有括号时,您将创建一个新的组。 0组是您的完整配对。尽管如果您添加?:,则可以拥有non-capturing groups。以以下示例为例,其中只有最后一组没有捕获:

match = re.search("(hello|hi), my name is (paul|henri). (?:bye|goodbye)", "Hi, my name is HENRI. GoodBye", re.IGNORECASE)
match.group(0)  # Hi, my name is HENRI
match.group(1)  # Hi
match.group(2)  # HENRI
match.group(3)  # ERROR!
match.groups()  # ('Hi', 'HENRI')

现在,我们如何匹配名称?这很棘手,您要么拥有所有可能名称的列表,要么认为名称始终位于I'mI amMy name is之类的句子之后。我要选择第二个,并创建一个像这样的模式:

names = "(?:my name is|i am|i'm) ([A-Za-z-]+)"

我有一个非捕获组,上面刚刚提到了这些短语,然后创建了一组[A-Za-z-]+。让我们分解一下(您可以查看docs以获得更多详细信息和更多模式):

  • []-匹配一组字符或范围
  • A-Z-匹配所有大写字母
  • a-z-匹配所有小写字母
  • --匹配-文字
  • [A-Za-z-]-匹配所有字母,大写和小写以及-
  • +-匹配重复了1个或更多的上一个令牌
  • [A-Za-z-]+-匹配1个或多个字母或-

所以现在我们尝试匹配所有模式并将其组合在一起:

import re
names = "(?:my name is|i am|i'm) ([A-Za-z-]+)"
colors = "(red|white|black|yellow|pink|brown|green|blue|purple|cyan)"
seasons = "(winter|spring|summer|fall)"

sentence = raw_input("Please input a sentence stating your name, your favorite color, and your favorite season: ")

# Check for name
name = re.search(names, sentence, re.IGNORECASE)
if name:
    print("Hey, my name is {}".format(name.group(1)))

# Check for color
color = re.search(colors, sentence, re.IGNORECASE)
if color:
    print("Oh, I like the color {}".format(color.group()))

# Check for season
season = re.search(seasons, sentence, re.IGNORECASE)
if season:
    print("I do think {} is the best season".format(season.group()))

运行时:

>>> Please input a sentence stating your name, your favorite color, and your favorite season: I'm Jon Snow. Winter is coming along with the WHITE WALKERS.
Hey, my name is Jon
Oh, I like the color WHITE
I do think Winter is the best season

如有任何疑问,请不要犹豫。编码很有趣,不要失去希望:)