2010-11-11 65 views
10

在Python中,在另一个字符串中查找字符串的优雅方法是什么,但只有当子字符串在整个单词中,而不是单词的一部分时才有效?在字符串中查找子字符串,但仅限于整个单词?

也许一个实例证实了我的意思:

string1 = "ADDLESHAW GODDARD" 
string2 = "ADDLESHAW GODDARD LLP" 
assert string_found(string1, string2) # this is True 
string1 = "ADVANCE" 
string2 = "ADVANCED BUSINESS EQUIPMENT LTD" 
assert not string_found(string1, string2) # this should be False 

我怎样才能最好编写一个名为string_found,会做什么,我需要的功能?我想我或许能有这样的事情掰过来:

def string_found(string1, string2): 
    if string2.find(string1 + " "): 
     return True 
    return False 

但是,这并不感到很优雅,也将不匹配字符串1,如果它是在字符串2月底。也许我需要一个正则表达式? (argh正则表达式恐惧)

回答

5

这里有一种方法可以在没有正则表达式的情况下(按照要求)假设您想要任何空格作为分隔符。

import string 

def find_substring(needle, haystack): 
    index = haystack.find(needle) 
    if index == -1: 
     return False 
    if index != 0 and haystack[index-1] not in string.whitespace: 
     return False 
    L = index + len(needle) 
    if L < len(haystack) and haystack[L] not in string.whitespace: 
     return False 
    return True 

而且这里的一些demo code(键盘是一个伟大的想法:感谢菲利克斯克林提醒我)

+0

不客气:) – 2010-11-11 14:20:45

+0

只要确保“保存”键盘粘贴,以便它们不会过期。 (我包括一个链接回到键盘评论,稍后也是我自己的笔记。) – 2010-11-13 07:27:07

+1

对于那些希望确保标点符号和空白符号被认为是有效的整个单词分隔符的人...将上面的代码修改为如下: '''不在(string.whitespace + string.punctuation)''' 也注意这个函数的效率是RegEx替代方案的两倍多,所以......如果你使用它很多,这个功能是要走的路。 – 2017-04-17 18:52:06

19

你可以(通过我的高亮显示)使用regular expressions和单词边界特殊字符\b

匹配空字符串,但只匹配单词的开头或结尾。一个单词被定义为一个字母数字或下划线字符序列,所以单词的末尾用空格或非字母数字,非下划线字符表示。请注意,\b定义为\w\W之间的边界,因此被视为字母数字的精确字符集取决于UNICODELOCALE标志的值。在字符范围内,\b表示退格字符,以便与Python的字符串文字兼容。

def string_found(string1, string2): 
    if re.search(r"\b" + re.escape(string1) + r"\b", string2): 
     return True 
    return False 

Demo


如果字边界是只为你空格,你也可以摆脱前和空格附加到你的字符串:

def string_found(string1, string2): 
    string1 = " " + string1.strip() + " " 
    string2 = " " + string2.strip() + " " 
    if string2.find(string1): 
     return True 
    return False 
+1

提出理论建议。你的剧本OTOH将无法使用。 ''\ b''是退格符(''\ x08'')的转​​义序列。我建议'r'\ b%s \ b'%(re.escape(string1))'代替're.search()'的第一个参数。实际上,整个函数可以简化为'return re.search(r'\ b%s \ b'%(re.escape(string1)),string2)不是None' – Walter 2010-11-11 13:59:46

+1

@Walter: B'。据说:*在**字符范围**内,'\ b'表示退格字符,... *至少适用于我。但是,字符串替换也不错:) – 2010-11-11 14:06:18

+0

当\ b在字符范围[a-z0-9 \ b] ...内时? \ b应该能够工作,并且在我进行的非常简短的测试中做了 – 2010-11-11 14:07:08

0

一种方法使用re或正则表达式,应完成此任务的模块是:

import re 

string1 = "pizza pony" 
string2 = "who knows what a pizza pony is?" 

search_result = re.search(r'\b' + string1 + '\W', string2) 

print(search_result.group())