在Python中,如何检查字符串以查看是否包含其他字符串的任何组合?

时间:2015-10-14 02:02:44

标签: python string algorithm parsing nodes

我有17万个单词列表,我正在编写一个算法,使用每个单词的图表来查看最长的单词链;

单词链是一个单词列表,其中第i个单词是带有一个额外字符的(i-1)个单词,其他字符以任何方式排列

A - > AN - > CAN - >甘蔗

现在我按字母顺序列出所有单词,如CAT = ACT

我说当字符串2包含字符串1加上另一个字符

时添加边

但是在

的情况下

A-> AT - > ACT

没有绘制AT和ACT之间的边缘,因为C分割了A和T而我的if语句只有在找到“AT”时才有效。

如何告诉python搜索字符串以使字符的顺序无关紧要?

4 个答案:

答案 0 :(得分:2)

您可以创建一组两个字符串:

set1 = set(string1)
set2 = set(string2)

然后查看string1是否包含string2

中的所有内容
set1.issubset(set2) # => returns True if set2 contains everything from set1

答案 1 :(得分:2)

你可以使用collections.Counter并将两个字符串转换成它(它会计算字符串中的字母),然后你可以比较它是否相等。示例 -

s1 = 'ACT'
s2 = 'CAT'
from collections import Counter
if Counter(s1) == Counter(s2):
    #Do stuff

演示 -

>>> s1 = 'ACT'
>>> s2 = 'CAT'
>>> from collections import Counter
>>> Counter(s1) == Counter(s2)
True

如果您想检查另一个字符串是否包含在另一个字符串中而不关心订单,可以使用any()内置函数,如下所示 -

s1 = 'AXCT'
s2 = 'CAT'
A = Counter(s1)
B = Counter(s2)
if not any(count > A.get(b, 0) for b,count in B):
    #Do stuff.

或者您也可以执行以下操作(如@Kevin in the comments所示) -

s1 = 'AXCT'
s2 = 'CAT'
A = Counter(s1)
B = Counter(s2)
if (B & A) == B:
    #Do stuff

答案 2 :(得分:0)

str1 = 'A'
str2 = 'T'
searchstring = 'ACT'

if str1 in searchstring and str2 in searchstring:
    print('it matched')


# bigger example

str1 = 'AT'
searchstring = 'ACT'
matches = [a for a in str1 if a in searchstring]
if len(matches) == len(searchstring):
    print('it matched')

答案 3 :(得分:0)

您可以将较长的字符串转换为正则表达式,然后匹配它。一种简单的方法是使所有字符都是可选的,首先检查目标字符串是否更长一个字符:

def can_reach(frm, to):
  if len(to) != len(frm) + 1: return False
  if not re.fullmatch(re.sub(r'(.)', r'\1?', to), frm): return False
  return True

如果你没有Python 3.4,那么使用一个明确的$锚:

def can_reach(frm, to):
  if len(to) != len(frm) + 1: return False
  if not re.match(re.sub(r'(.)', r'\1?', to) + '$', frm): return False
  return True