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 @@ @@的事情,我可以将@符号之间的@@所有内容作为单独的输入/调用。
答案 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)
你甚至可以去疯狂并编写一个从任意“标签”模式生成关键短语正则表达式的函数!我会把它作为读者的练习;)记住:几个字符具有特殊的正则表达式含义,如'*'和'?',所以如果你想匹配那个字面字符,你需要逃避它们(例如'\?')。