Python 3.6识别字符串以及Y中是否为X.

时间:2018-01-25 21:35:43

标签: python python-3.x

Newb程序员在这里处理我的第一个项目。我搜索了这个网站和python文档,要么我没有看到答案,要么我没有使用正确的术语。我已经阅读了正则表达式,如果部分,特别是和链接到其他似乎相关的部分。

import re

keyphrase = '@@' + '' + '@@'

print(keyphrase) #output is @@@@

j = input('> ') #@@whatever@@

if keyphrase in j:
    print('yay')
else:
    print('you still haven\'t figured it out...')

k = j.replace('@', '')
print(k) #whatever

这是一个小的reddit bot项目。我希望机器人被称为@@ whatever @@,然后能够用@@之间的单词进行操作。我已经设置了上面的代码来测试Python是否正在阅读它,但我一直得到“你仍然没有想到它......”quip。

我尝试在关键短语的中间添加REGEX \ W,但无济于事。还有\ $ \ $和引号

的奇怪组合

所以,我的问题是,如何在用户输入的关键短语中放置占位符?

例如,如果@@ comment @@做类似@@ this @@ @@的事情,我可以将@符号之间的@@所有内容作为单独的输入/调用。

4 个答案:

答案 0 :(得分:1)

您可以使用以下正则表达式r'@@(.*?)@@'来捕获您选择的关键短语中的所有内容。

示例输出:

>>> import re
>>> f = lambda s: re.match(r'@@(.*?)@@', s).group(1)
>>> f("@@whatever@@")
whatever
>>> f = lambda s: re.findall(r'@@(.*?)@@', s)  
>>> f("a @@comment@@ does something like @@this@@ @@I can grab@@ everything between the @ symbols as separate inputs/calls.")
['comment', 'this', 'I can grab']

它是如何工作的? (1)我们在括号()之间为捕获组1声明字符串常量的头部和尾部。很棒,几乎就在那里! (2)然后我们将所有字符.*?与强制执行的贪婪搜索匹配,以便我们捕获整个字符串。

推荐读物:

答案 1 :(得分:0)

如果您想抓取" @"之间的内容,请尝试以下操作:

j = input("> ")

"".join(j.split("@"))

答案 2 :(得分:0)

你没有在你的例子中获得@之间的任何信息,因为你在你给它的任何输入中有效地寻找'@@@@'。除非你碰巧连续放4个@,否则RE永远不会匹配。

你想要做的事情就像是  re.match('@@\W+@@', j)

将查找2个前导@@ s,然后查找大于1个字母数字字符(\ W +)的任何数字,然后2个尾随@@ s。从那里,你的条形码看起来很好,你应该能够抓住它。

答案 3 :(得分:0)

这样的事情应该有效:

import re

keyphrase_regex = re.compile(r'@@(.*)@@')

user_input = input('> ') 

keyphrase_match = keyphrase_regex.search(user_input)
# `search` returns `None` if regex didn't match anywhere in the string
keyphrase_content = keyphrase_match.group(1) if keyphrase_match else None

if keyphrase_content:
    keyphrase_content = keyphrase_match.group(1)
    print('yay! You submitted "', keyphrase_content, '" to the bot!')

else:  
    # Bonus tip: Use double quotes to make a string containing apostrophe 
    #            without using a backslash escape
    print("you still haven't figured it out...")

# Use `keyphrase_content` for whatever down here

正则表达式有点难以理解,因为它们的工作方式与大多数编程结构不同。它是描述模式的语言。

Regex One是一本很棒的初学者指南。

Regex101是一个在线沙箱,允许您键入正则表达式和一些示例字符串,然后实时查看匹配(和原因)

正则表达式@@(.*)@@基本上意味着“搜索字符串,直到找到两个'@'符号。就在那之后,开始捕获任何字符的零或更多。如果你找到另一个'@',停止捕获字符。如果'@'后跟另一个字符,请停止查看字符串,成功返回,并保持整个匹配(从第一个'@'到最后'@')。另外,抓住捕获的字符如果程序员要求你只是他们

编辑:推荐@ospahiu提出?懒惰量词。结合我们的方法的最终解决方案将如下所示:

# whatever_bot.py

import re

# Technically, Python >2.5 will compile and cache regexes automatically.
# For tiny projects, it shouldn't make a difference. I think it's better style, though.
# "Explicit is better than implicit"
keyphrase_regex = re.compile(r'@@(.*?)@@')

def parse_keyphrases(input):
    return keyphrase_regex.find_all(input)

Lambda很酷。我更喜欢它们用于一次性的东西,但上面的代码是我宁愿放在模块中的东西。个人偏好。

您甚至可以使用默认的“@@”替换正则表达式

# whatever_bot.py

import re

keyphrase_double_at_sign = re.compile(r'@@(.*?)@@')

def parse_keyphrases(input, keyphrase_regex=keyphrase_double_at_sign):
    return keyphrase_regex.find_all(input)

你甚至可以去疯狂并编写一个从任意“标签”模式生成关键短语正则表达式的函数!我会把它作为读者的练习;)记住:几个字符具有特殊的正则表达式含义,如'*'和'?',所以如果你想匹配那个字面字符,你需要逃避它们(例如'\?')。