Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在两个字符串中找到匹配的单词?_Python_Arrays_String_List_Overlap - Fatal编程技术网

Python 如何在两个字符串中找到匹配的单词?

Python 如何在两个字符串中找到匹配的单词?,python,arrays,string,list,overlap,Python,Arrays,String,List,Overlap,我有两条像这样的线 我叫博格丹和博格丹,我来自俄罗斯 我需要从这个字符串中获取wordBogdan。我总是知道第一句的结尾=第二句的开头 我怎样才能找到这个重叠 我的解决方案返回类似的字符 res = list(set('My name is Bogdan').intersection(set('Bogdan and i am from Russia'))) print(res) 返回 ['i', 'n', 'g', 'm', ' ', 's', 'B', 'a', 'd', 'o'] 首先

我有两条像这样的线

我叫博格丹
博格丹,我来自俄罗斯

我需要从这个字符串中获取word
Bogdan
。我总是知道第一句的结尾=第二句的开头

我怎样才能找到这个重叠

我的解决方案返回类似的字符

res = list(set('My name is Bogdan').intersection(set('Bogdan and i am from Russia')))
print(res)
返回

['i', 'n', 'g', 'm', ' ', 's', 'B', 'a', 'd', 'o']

首先最大限度地重叠两个字符串,然后通过减少重叠进行迭代:

def find_overlap(s1, s2):
    for i in range(len(s1)):
        test1, test2 = s1[i:], s2[:len(s1) - i]
        if test1 == test2:
            return test1

s1, s2 = "My name is Bogdan", "Bogdan and I am from Russia"
find_overlap(s1, s2)
# 'Bogdan'
s1, s2 = "mynameisbogdan", "bogdanand"
find_overlap(s1, s2)
# 'bogdan'
正如您所看到的,如果两个字符串不包含空格,这也可以工作

这有O(n)个运行时,但如果您首先确定两个字符串中的哪个较短,则可以将其缩减为O(min(n,m))

如果希望查找的字符串比两个字符串中最短的字符串短得多,可以将其设为偶数O(k),其中k是要查找的字符串的长度,从最小重叠开始:

def find_overlap(s1, s2):
    for i in range(1, len(s1) + 1):
        if i == len(s2):
            return None
        test1, test2 = s1[-i:], s2[:i]
        if test1 == test2:
            return test1

首先最大限度地重叠两个字符串,然后通过减少重叠进行迭代:

def find_overlap(s1, s2):
    for i in range(len(s1)):
        test1, test2 = s1[i:], s2[:len(s1) - i]
        if test1 == test2:
            return test1

s1, s2 = "My name is Bogdan", "Bogdan and I am from Russia"
find_overlap(s1, s2)
# 'Bogdan'
s1, s2 = "mynameisbogdan", "bogdanand"
find_overlap(s1, s2)
# 'bogdan'
正如您所看到的,如果两个字符串不包含空格,这也可以工作

这有O(n)个运行时,但如果您首先确定两个字符串中的哪个较短,则可以将其缩减为O(min(n,m))

如果希望查找的字符串比两个字符串中最短的字符串短得多,可以将其设为偶数O(k),其中k是要查找的字符串的长度,从最小重叠开始:

def find_overlap(s1, s2):
    for i in range(1, len(s1) + 1):
        if i == len(s2):
            return None
        test1, test2 = s1[-i:], s2[:i]
        if test1 == test2:
            return test1

可以使用集合交点

l1="My name is Bogdan"
l2="Bogdan and I am from Russia"
print(set(l1.split())&set(l2.split())) # set('Bogdan')
列表理解

l1="My name is Bogdan"
l2="Bogdan and I am from Russia"
[i for i in l1.split() if i in l2.split()] ['Bogdan']

可以使用集合交点

l1="My name is Bogdan"
l2="Bogdan and I am from Russia"
print(set(l1.split())&set(l2.split())) # set('Bogdan')
列表理解

l1="My name is Bogdan"
l2="Bogdan and I am from Russia"
[i for i in l1.split() if i in l2.split()] ['Bogdan']

其他选项,带有for循环:

def shared_words(s1, s2):
  res = []
  l_s1, l_s2 = set(s1.split()), set(s2.split())
  for ss1 in l_s1:
    if ss1 in l_s2: res.append(ss1)
  return res
应用于字符串:

s1 = "My name is Bogdan"
s2 = "Bogdan and I am from Russia"
print(shared_words(s1, s2)) #=> ['Bogdan']
或者,使用正则表达式仅拆分单词:

import re

def shared_words(s1, s2):
  res = []
  l_s1, l_s2 = set(re.findall(r'\w+',s1)), set(re.findall(r'\w+',s2))
  for ss1 in l_s1:
    if ss1 in l_s2: res.append(ss1)
  return res
要获得:

s1 = "My name is Bogdan, I am here"
s2 = "Bogdan and I am from Russia."
print(shared_words(s1, s2)) #=> ['Bogdan', 'I', 'am']

其他选项,带有for循环:

def shared_words(s1, s2):
  res = []
  l_s1, l_s2 = set(s1.split()), set(s2.split())
  for ss1 in l_s1:
    if ss1 in l_s2: res.append(ss1)
  return res
应用于字符串:

s1 = "My name is Bogdan"
s2 = "Bogdan and I am from Russia"
print(shared_words(s1, s2)) #=> ['Bogdan']
或者,使用正则表达式仅拆分单词:

import re

def shared_words(s1, s2):
  res = []
  l_s1, l_s2 = set(re.findall(r'\w+',s1)), set(re.findall(r'\w+',s2))
  for ss1 in l_s1:
    if ss1 in l_s2: res.append(ss1)
  return res
要获得:

s1 = "My name is Bogdan, I am here"
s2 = "Bogdan and I am from Russia."
print(shared_words(s1, s2)) #=> ['Bogdan', 'I', 'am']

你想用Bogdan做什么?两个字符串可以没有空格和点,比如
mynameisbogdan
Bogdan…
重叠可以是多个单词,还是一个单词的一部分?@BogdanMadzhuga你应该在问题中添加这个额外的要求,因为一些答案依赖于用空格分隔的单词。你想用Bogdan做什么?两个字符串可以没有空格和点,比如
mynameisbogdan
Bogdan…
重叠可以是多个单词,还是一个单词的一部分?@BogdanMadzhuga你应该在问题中添加这个额外的要求,因为一些答案依赖于用空格分隔的单词。是的,我现在找到了类似的解决方案。谢谢,如果他的答案回答了你的问题,你应该把它标记为正确的。是的,我现在找到了类似的答案。谢谢如果回答了您的问题,您应该将他的答案标记为正确。您至少应该只计算一次
s2
的拆分,而不是每次循环迭代。我还将它放入
集合
中,以在中获得恒定时间
。您至少应该只计算一次
s2
的分割,而不是每次循环迭代。我还将它放入
集合
中,以在
中获得恒定时间