Python中的字符串有一个find("somestring")方法,它返回字符串中"somestring"的索引号.
但是,假设我有一个如下字符串:
"$ 5 $ 7 $ 9总费用:$ 35 $ 14"
我想找到字符串"Total Cost" 之后第一次出现'$'的索引- 我希望能够告诉python,搜索'$',从索引编号开始"总成本",并返回您找到的第一次出现'$'的索引号(相对于整个字符串).find()方法将返回0,并且在这种情况下rfind()将不起作用.
一种克服这种方式的方法如下:
def findStrAfterStr(myString, searchText, afterText):
splitString = myString.split(afterText)
myIndex = len(splitString[0]) + len(afterText) + splitString[1].find(searchText)
return myIndex
myString = "$5 $7 $9 Total Cost: $35 $14"
searchText = "$"
afterText = "Total Cost"
findStrAfterStr(myString, searchText, afterText)
Run Code Online (Sandbox Code Playgroud)
但似乎应该有一种更简单的方法来做到这一点,我认为可能存在,我只是不知道它是什么.思考?
当我发现自己做了很多这样的事情时,这对切片特别有用:
myString[myString.find("startingSubstr"):myString.find("endingSubstr")]
Run Code Online (Sandbox Code Playgroud)
我自然希望"endingSubstr"成为"startingSubstr"之后出现的那个.
我希望匹配多个字符串标准,然后在R中对行进行子集,使用grepl查找匹配.我从另一个帖子中找到了一个很好的解决方案,其中使用了一些特定的代码(但你明白了):subset(GEMA_EO5, grepl(paste(l, collapse="|"),GEMA_EO5$RefSeq_ID))
我想知道是否有可能在两列中grepl,而不是上面的例子中的RefSeq_ID.也就是说,在grepl中通过任何其他方法.换句话说,我想在l中查找选项,而不仅仅是在一列中,而是在两列中(或者多列中).这可能吗?
例如:3列,ab和c.尽管(3,b)中的格式为"T I",但我希望选择T(第3行和第4行)的标准.它应该识别(4,a)和(3,b),因此链接到前一个问题.我希望它在列a和列b中查找,而不是一个或另一个.
a b c
A A C P L
V V B W E E
W T I P J G
T W P J
Run Code Online (Sandbox Code Playgroud) $keywords = array('red', 'blue', 'yellow', 'green', 'orange', 'white');
$strings = array(
'She had a pink dress',
'I have a white chocolate',
'I have a green balloon',
'I have a chocolate shirt',
'He had a new yellow book',
'We have many blue boxes',
'I have a magenta tie');
Run Code Online (Sandbox Code Playgroud)
实际上strings阵列非常庞大(50k +条目).
什么是运行搜索和提取匹配的字符串的最佳方式只?
我正在关注 Cormen Leiserson Rivest Stein (clrs) 的书,遇到了用于字符串匹配的“kmp 算法”。我使用 Python(原样)实现了它。
但是,由于某种原因,它似乎不起作用。我的错在哪里?
代码如下:
def kmp_matcher(t,p):
n=len(t)
m=len(p)
# pi=[0]*n;
pi = compute_prefix_function(p)
q=-1
for i in range(n):
while(q>0 and p[q]!=t[i]):
q=pi[q]
if(p[q]==t[i]):
q=q+1
if(q==m):
print "pattern occurs with shift "+str(i-m)
q=pi[q]
def compute_prefix_function(p):
m=len(p)
pi =range(m)
pi[1]=0
k=0
for q in range(2,m):
while(k>0 and p[k]!=p[q]):
k=pi[k]
if(p[k]==p[q]):
k=k+1
pi[q]=k
return pi
t = 'brownfoxlazydog'
p = 'lazy'
kmp_matcher(t,p)
Run Code Online (Sandbox Code Playgroud) 我的目标是检测 2 个字符串是否相同但顺序不同。
Example
"hello world my name is foobar" is the same as "my name is foobar world hello"
Run Code Online (Sandbox Code Playgroud)
我已经尝试过将两个字符串拆分为列表并在循环中进行比较。
text = "hello world my name is foobar"
textSplit = text.split()
pattern = "foobar is my name world hello"
pattern = pattern.split()
count = 0
for substring in pattern:
if substring in textSplit:
count += 1
if (count == len(pattern)):
print ("same string detected")
Run Code Online (Sandbox Code Playgroud)
它返回了我的意图,但这实际上是正确和有效的方式吗?也许还有另一种方法。任何有关该主题的期刊建议都非常好。
编辑 1:重复的单词很重要
text = "fish the fish the fish fish fish"
pattern = "the …Run Code Online (Sandbox Code Playgroud) 我有一个这样的输入表:
In [182]: data_set
Out[182]:
name ID
0 stackoverflow 123
1 stikoverflow 322
2 stack, overflow 411
3 internet.com 531
4 internet 112
5 football 001
Run Code Online (Sandbox Code Playgroud)
我想根据模糊模糊对类似的字符串进行分组。因此,在应用模糊匹配后,所有超过某个相似度阈值(如 > %90 相似度)的字符串将组合在一起。所以期望的输出是:
In [182]: output
Out[182]:
name ID group
0 stackoverflow 123 1
1 stikoverflow 322 1
2 stack, overflow 411 1
3 internet.com 531 2
4 internet 112 2
5 football 001 3
Run Code Online (Sandbox Code Playgroud)
我正在搜索不同的主题,我发现这个和这个只是名称匹配而不是聚类。此外,这个只显示了最佳匹配,它对我没有帮助。这个页面也解释了k-means聚类需要预先设置聚类的数量,这在这种情况下是不切实际的。
更新:
我发现包中的process方法可以在fuzzywuzzy某种程度上解决我的问题。但是此方法仅将字符串与列表进行比较,而不是将列表与列表进行比较:
from fuzzywuzzy import …Run Code Online (Sandbox Code Playgroud) 这个问题的要点是:
所以似乎将字符串的部分匹配if ($C -match $b.Name)视为匹配?有没有更好的方法来强制字符串的完整[匹配]?
我有一个目录,里面装满了大量的 .7z 文件。我需要不断清理这个目录。还有另一个脚本,它早于我在这里的工作,目前正在工作,但它由 3000 行组成,并且不断生成不正确的匹配,并且不记录移动或删除的内容。使它如此庞大的部分原因是它有大量的路径,这些文件需要移动到硬编码的位置。有时,这些路径会发生变化,更新起来很麻烦。
所以我开始制作一个小得多的脚本,它在 CSV 文件中引用了所有这些路径。除了这些路径之外,CSV 文件中还记录了已知的文件名。
我正在尝试将文件名与我的 CSV 文件中记录的名称进行匹配。它通常有效,但有时我会得到不正确的匹配。
假设我有两个以类似方式启动的文件,Apple 和 Apple_Pie。Apple 会匹配 Apple 并移动到正确的目录,但 Apple_Pie 将首先匹配 Apple 并移动到错误的目录。在$C清除变量之前,它将 Apple_Pie 匹配到正确的目录,但此时 Apple_Pie 不再存在于需要从中移动的原始目录中。
所以似乎将if ($C -match $b.Name)字符串的部分匹配视为匹配?有没有更好的方法来强制完成一个字符串?
我认为我对-match应该如何工作的期望有点偏离。
我在这里使用的正则表达式是去除由另一个自动化进程添加到文件名中的日期时间的每个文件名。我用它来隔离我想要匹配的文件名。
$Wild = "C:\Some\Folder\With\Files\"
$CSV = "C:\Another\Folder\Paths.csv"
$Content = gci $wild
$Reg1 = [regex] '_[0-9]{4}-[0-9]{2}-[0-9]{2}[A-Z]{1}[0-9]{2}_[0-9]{2}_[0-9]{2}'
$Reg2 = [regex] '[0-9]{4}-[0-9]{2}-[0-9]{2}[A-Z]{1}[0-9]{2}_[0-9]{2}_[0-9]{2}'
$Paths = import-csv -path $CSV -header Name, Path
foreach ($a …Run Code Online (Sandbox Code Playgroud) 我目前正在处理一个非常大的位置数据库,并试图将它们与它们的真实世界坐标相匹配.
为此,我下载了包含大量条目的geoname数据集.它给出了可能的名称和纬度/经度坐标.为了尝试加快这个过程,我设法通过删除对我的数据集没有意义的条目,将巨大的csv文件(1.6 GB)减少到0.450 GB.它仍然包含400万个条目.
现在我有很多条目,例如:
知道字符串匹配这么长的字符串,我通过NLTK 使用Standford的NER来获得更好的字符串来限定我的位置.现在我有类似的字符串:
geoname数据集包含以下内容:
我正在应用这个算法来获得我的条目和包含4M条目的geoname csv之间的良好匹配.我首先阅读geoname_cleaned.csv文件并将所有数据放入列表中.对于我有的每个条目,我然后string_similarity()在当前条目和geoname_list的所有条目之间调用我的每个条目
def get_bigrams(string):
"""
Take a string and return a list of bigrams.
"""
s = string.lower()
return [s[i:i+2] for i in list(range(len(s) - 1))]
def string_similarity(str1, str2):
"""
Perform bigram comparison between two strings
and return a percentage match in …Run Code Online (Sandbox Code Playgroud) python language-agnostic algorithm performance string-matching
我有这个向量:
vector <- c("XXXX-X-X", "---X-X-X", "--X---XX", "--X-X--X", "-X---XX-", "-X--X--X", "X-----XX", "X----X-X", "X---XX--", "XX--X---", "---X-XXX", "--X-XX-X")
Run Code Online (Sandbox Code Playgroud)
我想检测出现 X 的最大连续次数。所以,我的预期向量是:
4, 1, 2, 1,2, 1, 2, 1, 2, 2, 3, 2
Run Code Online (Sandbox Code Playgroud) Fuzzywuzzy是一个非常流行的字符串匹配库。根据库的文档,提到它使用 Levenshtein 距离来计算序列之间的差异。但是仔细检查后,我发现它实际上使用SequenceMatcher了difflib库中的函数。根据文档,此函数使用 Ratcliff/Obershelp 模式匹配算法。
根据定义,Levenshtein 距离是将一个字符串转换为另一个字符串所需的最小编辑次数,Ratcliff/Obershelp 模式匹配算法计算匹配字符的两倍数除以两个字符串中的字符总数。比较两者的密切相关帖子。
当我运行一个例子时,我得到了 Fuzzywuzzy 中 SequenceMatcher 和 ratio 函数的相同结果。
from difflib import SequenceMatcher
from fuzzywuzzy import fuzz
s = SequenceMatcher(None, "abcd", "bcde")
s.ratio()
# 0.75
fuzz.ratio("abcd", "bcde")
# 75
Run Code Online (Sandbox Code Playgroud)
如果我手动计算两个字符串之间的 Levenshtein 距离,我想它只会是 2。在这种情况下,它如何像贡献者在文档中所写的那样使用 Levenshtein 距离?
string-matching ×10
python ×6
string ×3
algorithm ×2
r ×2
regex ×2
arrays ×1
fuzzywuzzy ×1
pandas ×1
performance ×1
php ×1
powershell ×1
stringr ×1