标签: string-matching

如何找到python中另一个子字符串后出现的第一个子字符串?

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"之后出现的那个.

python string string-matching

5
推荐指数
1
解决办法
4782
查看次数

[R]中两列的字符串匹配

我希望匹配多个字符串标准,然后在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)

string r string-matching

5
推荐指数
1
解决办法
4640
查看次数

需要使用正则表达式防止重复字符

如何使用 RegEx 来测试以下模式:

  1. 字符串长度必须为 4-10 个字符
  2. 字符串不得有任何重复字符(两个字符不能相同且相邻)

我对此进行了研究,我认为我很接近:

^(?!(.)\1).{4,10}$
Run Code Online (Sandbox Code Playgroud)

ab12这将正确找到和的匹配项12ab。它还正确地拒绝1111aaaa。然而它错误地接受了12aaab11

它似乎只查找字符串开头的重复字符。我尝试移动或删除^$,但我需要它们来进行最大字符检查。我还尝试了几种变体(.)\1来查找重复字符,但没有成功。

任何帮助或提示将不胜感激。

PS - 如果有人知道答案,我实际上希望最多允许一对重复字符,但我认为这太难了,并决定禁止任何重复字符。

regex string match string-matching

5
推荐指数
1
解决办法
7599
查看次数

数组中的PHP数组搜索

$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 +条目).

什么是运行搜索和提取匹配的字符串的最佳方式

php arrays string-matching

5
推荐指数
1
解决办法
107
查看次数

使用Python的jellyfish模块获得最佳匹配(部分字符串匹配)

我正在尝试创建某种字典来附加我的结果并使用 jaro 距离函数获得最佳匹配。

这是我尝试匹配两个列表并在两个列表中获得最佳匹配名称的一部分。

例子:

import jellyfish
jellyfish.jaro_distance(u'jellyfish', u'sellyfish')

output: 
0.9259259259259259
Run Code Online (Sandbox Code Playgroud)

我想做的是:

listA = ['grellofish','mellofush','jellyfihs','sellyfish','salmonfish']
listB = ['jellyfish','salmonfish']

#convert to unicode
listA = [unicode(i) for i in listA]
listB = [unicode(i) for i in listB]

for nickB in listB:
    for nickA in listA:
        results = jellyfish.jaro_distance(nickA, nickB)
        print nickB,nickA,results

output:
jellyfish grellofish 0.825925925926
jellyfish mellofush 0.777777777778
jellyfish jellyfihs 0.962962962963
jellyfish sellyfish 0.925925925926
jellyfish salmonfish 0.685185185185
salmonfish grellofish 0.733333333333
salmonfish mellofush 0.7
salmonfish jellyfihs 0.618518518519
salmonfish sellyfish 0.755555555556
salmonfish salmonfish 1.0 …
Run Code Online (Sandbox Code Playgroud)

python string-matching fuzzywuzzy

5
推荐指数
1
解决办法
6246
查看次数

检测 2 个字符串相同但顺序不同

我的目标是检测 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)

python string-matching

5
推荐指数
1
解决办法
1758
查看次数

在 PowerShell 中匹配字符串

这个问题要点是:

所以似乎将字符串的部分匹配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)

regex powershell string-matching

5
推荐指数
2
解决办法
3万
查看次数

在大量句子中查找 n 元语法频率

我有一组短信。让我们打电话给他们吧m1, m2, ....。消息的最大数量如下1,000,000。每条消息1024的长度都低于字符,并且全部为小写。我们还可以选择一个 n-gram s1

我需要从所有这些消息中找到所有可能的子字符串的频率。例如,假设我们只有两条消息:

m1 = a cat in a cage
m2 = a bird in a cage
Run Code Online (Sandbox Code Playgroud)

这两条消息中某些 n 元语法的频率:

'a' = 4
'in a cage' = 2
'a bird' = 1
'a cat' = 1
...
Run Code Online (Sandbox Code Playgroud)

请注意,由于in = 2、 、in a = 2a cage = 2是 和 的子集in a cage = 2,并且具有相同的频率,因此不应列出它们。只取最长的、频率最高的;遵循以下条件:最长的 sn-gram 最多由 8 个单词组成,总字符数低于 30。如果 n-gram 超过此限制,则可以将其分解为两个或多个 n-gram 并单独列出。 …

javascript algorithm substring string-matching

5
推荐指数
1
解决办法
933
查看次数

加快"最接近"的字符串匹配算法

我目前正在处理一个非常大的位置数据库,并试图将它们与它们的真实世界坐标相匹配.

为此,我下载包含大量条目的geoname数据集.它给出了可能的名称和纬度/经度坐标.为了尝试加快这个过程,我设法通过删除对我的数据集没有意义的条目,将巨大的csv文件(1.6 GB)减少到0.450 GB.它仍然包含400万个条目.

现在我有很多条目,例如:

  1. 上周我在挪威尤通黑门山的露营地看到了Slettmarkmountains山脉
  2. 冒险在神仙的幽谷,斯凯岛,苏格兰,英国
  3. 早上在移民荒野,加利福尼亚州

知道字符串匹配这么长的字符串,我通过NLTK 使用Standford的NER来获得更好的字符串来限定我的位置.现在我有类似的字符串:

  1. Slettmarkmountains Jotunheimen挪威
  2. 童话幽谷斯凯岛苏格兰英国
  3. 移民荒野加州
  4. 优胜美地国家公园
  5. 半圆顶约塞米蒂国家公园

geoname数据集包含以下内容:

  1. Jotunheimen挪威Lat Long
  2. Slettmarkmountains Jotunheimen挪威Lat Long
  3. 布莱斯峡谷拉特龙
  4. Half Dome Lat Long
  5. ...

我正在应用这个算法来获得我的条目和包含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

5
推荐指数
1
解决办法
873
查看次数

R 中大数据高效字符串匹配(和索引)的技巧?

我想做的事

我有许多唯一的 ID,例如id1, id2, etc.。它们出现在多个组中,每个组都是 1 到 100 个 id 之间的随机样本,例如

[1] "id872- id103- id746-"                             
[2] "id830- id582-"                                   
[3] "id663- id403- id675- id584- id866- id399- id28- id550-"
Run Code Online (Sandbox Code Playgroud)

我想找到一个id所属的所有组,例如id1

groups.with.id[1] = grep("id1-", groups)
Run Code Online (Sandbox Code Playgroud)

我的问题

数据量很大(80k id,1M 个组),在我的笔记本电脑上大约需要12 个小时。我认为这是我正在执行 80k 次(每个 id 一次)以及每次访问一个巨大对象(1M 组)的事实的组合。

有什么办法可以提高效率吗?

(我经常遇到 REg 中较大对象的问题,重复索引具有 >10k 行的数据帧会变得非常慢。也赞赏大型对象的有效索引的一般答案!

示例代码

# make toy dataset
n.ids = 80000 # number of unique ids
n.groups = 100 # number of groupings

# make data
ids = …
Run Code Online (Sandbox Code Playgroud)

string r string-matching processing-efficiency large-data

5
推荐指数
1
解决办法
278
查看次数