将模式与一组字符串逐个进行比较的最佳方法是什么,同时评估模式与每个字符串匹配的数量?在我使用正则表达式的有限经验中,使用正则表达式匹配字符串似乎是一个非常二元的操作...无论模式有多复杂,最终它要么匹配要么不匹配.我正在寻找更强大的功能,而不仅仅是匹配.是否有与此相关的好技术或算法?
这是一个例子:
假设我有一个模式foo bar,我想找到与以下字符串中最匹配的字符串:
foo for
foo bax
foo buo
fxx bar
Run Code Online (Sandbox Code Playgroud)
现在,这些都没有实际匹配模式,但哪个不匹配最接近匹配?在这种情况下,foo bax它将是最佳选择,因为它匹配7个字符中的6个.
抱歉,如果这是一个重复的问题,当我查看这个问题是否已经存在时,我真的不知道究竟要搜索什么.
我正在尝试开发一个python算法来检查字符串是否可以是另一个单词的缩写.例如
fck是匹配fc kopenhavn因为它匹配单词的第一个字符.fhk不匹配.fco不应该匹配,fc kopenhavn因为没有人会将FC Kopenhavn缩写为FCO.irl是匹配的in real life.ifk是匹配的ifk goteborg.aik是匹配的allmanna idrottskluben.aid是匹配的allmanna idrottsklubben.这不是一个真正的团队名称缩写,但我想除非您应用有关如何形成瑞典语缩写的领域特定知识,否则很难将其排除.manu是匹配的manchester united.很难描述算法的确切规则,但我希望我的例子能说明我所追求的内容.
更新我在显示匹配字母大写的字符串时犯了一个错误.在实际场景中,所有字母都是小写的,因此它不像检查哪些字母是大写的那么容易.
我用c ++实现了Damerau-Levenshtein距离,但它没有为输入提供正确的o/p(pantera,aorta)正确的o/p是4但是我的代码给出了5 .....
int editdist(string s,string t,int n,int m)
{
int d1,d2,d3,cost;
int i,j;
for(i=0;i<=n;i++)
{
for(j=0;j<=m;j++)
{
if(s[i+1]==t[j+1])
cost=0;
else
cost=1;
d1=d[i][j+1]+1;
d2=d[i+1][j]+1;
d3=d[i][j]+cost;
d[i+1][j+1]=minimum(d1,d2,d3);
if(i>0 && j>0 && s[i+1]==t[j] && s[i]==t[j+1] ) //transposition
{
d[i+1][j+1]=min(d[i+1][j+1],d[i-1][j-1]+cost);
}
}
}
return d[n+1][m+1];
}
Run Code Online (Sandbox Code Playgroud)
我没有看到任何错误.有人可以发现代码有问题吗?
我有以下数据框,我想根据匹配的字符串提取行.
> GEMA_EO5
gene_symbol fold_EO p_value RefSeq_ID BH_p_value
KNG1 3.433049 8.56e-28 NM_000893,NM_001102416 1.234245e-24
REXO4 3.245317 1.78e-27 NM_020385 2.281367e-24
VPS29 3.827665 2.22e-25 NM_057180,NM_016226 2.560770e-22
CYP51A1 3.363149 5.95e-25 NM_000786,NM_001146152 6.239386e-22
TNPO2 4.707600 1.60e-23 NM_001136195,NM_001136196,NM_013433 1.538000e-20
NSDHL 2.703922 6.74e-23 NM_001129765,NM_015922 5.980454e-20
DPYSL2 5.097382 1.29e-22 NM_001386 1.062868e-19
Run Code Online (Sandbox Code Playgroud)
所以我想根据$ RefSeq_ID中的匹配字符串提取两行,它可以正常使用以下内容:
> list<-c("NM_001386", "NM_020385")
> GEMA_EO6<-subset(GEMA_EO5, GEMA_EO5$RefSeq_ID %in% list, drop = TRUE)
> GEMA_EO6
gene_symbol fold_EO p_value RefSeq_ID BH_p_value
REXO4 3.245317 1.78e-27 NM_020385 2.281367e-24
DPYSL2 5.097382 1.29e-22 NM_001386 1.062868e-19
Run Code Online (Sandbox Code Playgroud)
但是有些行有几个用逗号分隔的RefSeq_ID,所以我正在寻找一种通用的方法来告诉$ RefSeq_ID是否包含某个字符串模式然后将该行子集化.
我的架构:
<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.StopFilterFactory"
ignoreCase="true"
words="stopwords.txt"
enablePositionIncrements="true"
/>
<filter class="solr.WordDelimiterFilterFactory"
generateWordParts="1" generateNumberParts="1"
catenateWords="1" catenateNumbers="1" catenateAll="0"
splitOnCaseChange="1" splitOnNumerics="0"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.SnowballPorterFilterFactory" language="English"
protected="protwords.txt"/>
</analyzer>
</fieldType>
Run Code Online (Sandbox Code Playgroud)
我想要合作的组合:
"沃尔玛","沃尔玛","沃尔玛","沃尔玛","沃尔玛"
鉴于这些字符串中的任何一个,我想找到另一个字符串.
因此,有以下25种组合:
(第一列表示搜索的输入文本,第二列表示预期的匹配)
(Walmart,Walmart)
(Walmart,WalMart)
(Walmart,Wal Mart)
(Walmart,Wal-Mart)
(Walmart,Wal-mart)
(WalMart,Walmart)
(WalMart,WalMart)
(WalMart,Wal Mart)
(WalMart,Wal-Mart)
(WalMart,Wal-mart)
(Wal Mart,Walmart)
(Wal Mart,WalMart)
(Wal Mart,Wal Mart)
(Wal Mart,Wal-Mart)
(Wal Mart,Wal-mart)
(Wal-Mart,Walmart)
(Wal-Mart,WalMart)
(Wal-Mart,Wal Mart)
(Wal-Mart,Wal-Mart)
(Wal-Mart,Wal-mart)
(Wal-mart,Walmart)
(Wal-mart,WalMart)
(Wal-mart,Wal Mart)
(Wal-mart,Wal-Mart)
(Wal-mart,Wal-mart)
Run Code Online (Sandbox Code Playgroud)
我的架构的当前限制:
1. "Wal-Mart" -> "Walmart",
2. "Wal Mart" -> …Run Code Online (Sandbox Code Playgroud) 我想在视频节目列表中搜索特定的电影标题,搜索MATCH,并使用Index返回其描述.我知道这可以通过A列过滤器中的文本搜索来完成,但我想用公式来做.
**编辑:我认为这个问题的第一个版本让我觉得我只有几部电影和头衔.这些统计信息可能有所帮助
Column A: 2,000 Total Video Titles (movie titles can appear more than once)
Column E: 50 Movie Titles
Column F: 50 Movie Descriptions
Run Code Online (Sandbox Code Playgroud)
例:
Video titles (2000) Movie Titles Movie Description
Spiderman Review and BTS Spiderman Spiderman_description
Dark Knight clips Star Wars Star Wars_description
Fun Fact Star Wars Dark Knight Dark Night_description
Why I love Dark Knight
Dark Knight highlight
Always watch dark knight alone
Run Code Online (Sandbox Code Playgroud)
.1,996更多视频
在另外两列中,我有标题和说明:
=if(isnumber(find("Spiderman",A2)),index(F2:F4,match("Spiderman",E2:E4,0)))
Run Code Online (Sandbox Code Playgroud)
......还有46部电影和描述
编辑:添加更多视频标题:
{Index($F$2:$F$4,match(TRUE,isnumber(find($E$2:$E$4,A2)),0))}
Run Code Online (Sandbox Code Playgroud)
在B2中,我可以输入
Column A: 2,000 Total Video Titles …Run Code Online (Sandbox Code Playgroud) 我有2个向量.
x=c("a", "b", "c", "d", "a", "b", "c")
y=structure(c(1, 2, 3, 4, 5, 6, 7, 8), .Names = c("a", "e", "b",
"c", "d", "a", "b", "c"))
Run Code Online (Sandbox Code Playgroud)
我想匹配a到a,b到b相应的序列,从而使x[2]匹配y[3],而不是y[7]; 和x[5]匹配y[6]而不是y[1]等等.
lapply(x, function(z) grep(z, names(y), fixed=T))
Run Code Online (Sandbox Code Playgroud)
得到:
[[1]]
[1] 1 6
[[2]]
[1] 3 7
[[3]]
[1] 4 8
[[4]]
[1] 5
[[5]]
[1] 1 6
[[6]]
[1] 3 7
[[7]]
[1] 4 …Run Code Online (Sandbox Code Playgroud) 用于字符串匹配的KMP算法.以下是代码,我在网上找到了计算的最长前缀后缀数组:
认定中:
lps[i] = the longest proper prefix of pat[0..i]
which is also a suffix of pat[0..i].
Run Code Online (Sandbox Code Playgroud)
码:
void computeLPSArray(char *pat, int M, int *lps)
{
int len = 0; // length of the previous longest prefix suffix
int i;
lps[0] = 0; // lps[0] is always 0
i = 1;
// the loop calculates lps[i] for i = 1 to M-1
while(i < M)
{
if(pat[i] == pat[len])
{
len++;
lps[i] = len;
i++;
}
else …Run Code Online (Sandbox Code Playgroud) 我试图在向量中找到一个字符串.对于Eg:查询="ab"in vector = ["ab","cd","abc","cab"]
问题是:当我使用函数strfind(vector,query)时,它给出了所有带有字符串"ab"的索引.在这种情况下,"ab"包括"abc"和"cab".但我只想要"ab"的索引而不是其他索引.Octave有没有特定的功能?
我正在尝试通过将杂乱的站点名称列表与已批准的列表进行匹配来清理数据库。
例如,首选站点名称可能是“Cotswold Water Park Pit 28”,但该站点已输入到数据库中:“Pit 28”、“28”、“CWP Pit 28”和“Cotswold 28”。
数据看起来像这样:
approved <- c("Cotswold Water Park Pit 28", "Cotswold Water Park Pit 14", "Robinswood Hill")
messy <- c("Pit 28", "28", "CWP Pit 28", "Cotswold 28", "14", "Robinswood")
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种方法来将每个元素中的单词/数字(非空格字符簇)messy与approved. 理想情况下,我最终会得到这样的结果:
Cotswold Water Park Pit 28 Cotswold Water Park Pit 14 Robinswood Hill
[1,] "Pit 28" "Pit 28" "Robinswood"
[2,] "28" "CWP Pit 28" NA
[3,] "CWP Pit 28" "14" NA
[4,] "Cotswold 28" NA NA
Run Code Online (Sandbox Code Playgroud)
这些approved …
string-matching ×10
r ×3
c++ ×2
string ×2
abbreviation ×1
algorithm ×1
excel ×1
excel-2010 ×1
lucene ×1
octave ×1
python ×1
regex ×1
slug ×1
solr ×1
solrj ×1
spreadsheet ×1
stringr ×1
subset ×1
textmatching ×1
vector ×1