使用Regex OR运算符来容纳用户输入" A"或" An"

时间:2015-04-28 05:30:49

标签: python regex

我正在尝试验证用户输入' a' | '一个'这将满足if语句。如果不满意,elif块将检查第二个单词是否是"关于"如果不是"关于",它将检查"任何人" ;。很遗憾'关于' &安培; "人"两个字母都以' a'开头。或者''所以我需要添加一个空间'在' a'结束后' an'允许正则表达式检测差异。

# Receive User input.
secrets = {}
secrets['text'] = request.GET.get('text')

regex_a = re.compile("(a|an)")
regex_about = re.compile('about')
regex_anyone = re.compile('anyone')

# Get second word from secrets[text]
secondword = secrets['text'].split()[1]
# If 2nd word is == 'a/an'
if regex_a.match(secondword):
    return HttpResponse("Text was (a) or (an)")

# Else if 2nd word is == about
elif regex_about.match(secondword):
    return HttpResponse("Second word was (about)")

elif regex_anyone.match(secondword):
    return HttpResponse("Second word was (anyone)")

else:
    return HttpResponse("Failed to interpret user input")

即使用户输入"关于"当前的正则表达式("(a|an)")也会返回Text was (a) or (an)或者"任何人"作为第二个词,这是预期的。

所以我还尝试了("(a\s|an\s)"),当第二个单词的输入是' a'或者''。但是它会返回正确的响应' about' &安培; '人&#39 ;.这真令人困惑......

然后我也尝试了Failed to interpret user input,它返回与之前测试相同的结果。

除了这三项测试之外,我还尝试了很多其他测试,但不会在这里列出,因为有很多测试。

4 个答案:

答案 0 :(得分:5)

使用此:

(a\b|an\b)

\b是一个单词边界,与单词的结尾相匹配。

Demo here。欢迎使用Stack Overflow!如果您还没有参加帮助部分的网站导览! : - )

答案 1 :(得分:1)

您可以使用:

regex_a = re.compile("(a|an)$")

这样你告诉正则表达式字符串需要在那里结束匹配。

正则表达式("(a\s|an\s)")永远不会起作用,因为它希望子字符串'a ''an '匹配,问题在于split()中的secondword = secrets['text'].split()[1]返回空格修剪的字符串。

答案 2 :(得分:1)

import re
sentence = "I am about to finish my Engineering and become an Engineer and a responsible person."
re.findall(r'(a|an)\s', sentence)

额外的空格会将其视为单独的单词。

答案 3 :(得分:0)

使用re.match

pattern = "^(A|An)$|^((?!^A$|^An$)about)$|^((?!^((?!^A$|^An$)about)$)anyone)$"
m = re.match(pattern, secondword)

if m:
    print(m.groups())

以下是此表达式的细分:

^(A|An)$

这与"A""An"相匹配。如果这不匹配,那么它会转到下一个案例。

^((?!^A$|^An$)about)$

匹配单词"about",但如果"A""An"不作为孤立单词出现。如果这不匹配,则转到下一个案例。

^((?!^((?!^A$|^An$)about)$)anyone)$

这与单词"anyone"匹配,但仅当"about"作为孤立单词(在没有"A""An"时)才会出现。

您可以测试正则表达式here