从这个链接我使用以下代码:
my_other_string = 'the_boat_has_sunk'
my_list = ['car', 'boat', 'truck']
my_list = re.compile(r'\b(?:%s)\b' % '|'.join(my_list))
if re.match(my_list, my_other_string):
print('yay')
Run Code Online (Sandbox Code Playgroud)
但它不起作用.我想打印__CODE__后__CODE__,它打印此:
re.compile('\\b(?:car|boot|truck)\\b')
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
编辑:
我不能分开单词,__CODE__因为我并不总是知道会出现什么样的字符串.因此,如果列表中的一个单词在字符串中,则不一定是单独的单词.
EDIT2:
改为__CODE__.
re.match仅将输入字符串的开头与正则表达式匹配.所以这只适用于以字符串开头的字符串my_list.
re.search 另一方面,搜索整个字符串以匹配正则表达式.
import re
my_list = ['car', 'boat', 'truck']
my_other_string = 'I am on a boat'
my_list = re.compile(r'\b(?:%s)\b' % '|'.join(my_list))
if re.search(my_list, my_other_string):#changed function call here
print('yay')
Run Code Online (Sandbox Code Playgroud)
对于字符串"我在船上",re.match将失败,因为字符串的开头是"I",它与正则表达式不匹配.re.search也将不匹配第一个字符,但将通过字符串,直到它到达"船",此时它将找到匹配.
如果我们改为使用字符串"Boat is what is my on",re.match并且re.search将正则表达式与字符串匹配,因为字符串现在以匹配开头.
这不是一个单词用下划线连接的常规句子。由于您只是检查该单词是否存在,因此您可以删除\b(因为它在单词边界上匹配并且_是单词字符!)或添加替代项:
import re
my_other_string = 'the_boat_has_sunk'
my_list = ['car', 'boat', 'truck']
my_list = re.compile(r'(?:\b|_)(?:%s)(?=\b|_)' % '|'.join(my_list))
if re.search(my_list, my_other_string):
print('yay')
Run Code Online (Sandbox Code Playgroud)
编辑:
既然你说如果列表中的某个单词在字符串中,则它必须为真,不仅作为一个单独的单词,而且如果例如船库在字符串中,它也不能匹配,所以我建议首先替换非单词字符和_空格,然后使用您的正则表达式\b:
import re
my_other_string = 'the_boathouse_has_sunk'
my_list = ['car', 'boat', 'truck']
my_other_string = re.sub(r'[\W_]', ' ', my_other_string)
my_list = re.compile(r'\b(?:%s)\b' % '|'.join(my_list))
if re.search(my_list, my_other_string):
print('yay')
Run Code Online (Sandbox Code Playgroud)
这不会打印yay,但如果删除house,它就会打印。
请参阅IDEONE 演示 2
| 归档时间: |
|
| 查看次数: |
2632 次 |
| 最近记录: |