Regex 正则表达式:查找重复模式

Regex 正则表达式:查找重复模式,regex,r,Regex,R,在R中有一个字符串s=“;123;;123;;456;;124;;123;;567;”,它显示一些用“;”分隔的ID,我想找到重复的ID,因此在本例中“123;”是重复的。我在R中使用了以下命令: gregexpr("(;[1-9]+;).*\1", s) 但它没有找到重复的模式。你知道怎么了吗 长字符串的一个示例: 1760381;;1774536;;1774614;;1774617;;1774705;;1774723;;1775013;;1902321;;1928678;;2105486;

在R中有一个字符串
s=“;123;;123;;456;;124;;123;;567;”
,它显示一些用“;”分隔的ID,我想找到重复的ID,因此在本例中“123;”是重复的。我在R中使用了以下命令:

gregexpr("(;[1-9]+;).*\1", s)
但它没有找到重复的模式。你知道怎么了吗

长字符串的一个示例:

1760381;;1774536;;1774614;;1774617;;1774705;;1774723;;1775013;;1902321;;1928678;;2105486;;2105514;;2105544;;2105575;;2105585;;2279115;;2379236;;290927;;542280;;555749;;641540;;683822;;694934;;713228;;713248;;713249;;726949;;727204;;731434;;754522;;7693856;;100095;;1003838;;1045582;;1079057;;1108697;;1231229;;124087;;1249672;;1328126;;1412065;;1419930;;1441743;;1470580;;1476585;;1502106;;1556149;;1637775;;1643922;;1655644;;1755547;;1759001;;1760295;;1760296;;1760320;;1760326;;1760338;;1760348;;1760349;;1760350;;1760353;;1760375;;1760376;;1760377;;1760378;;1760388;;1760401;;1760402;;1760403;;1760410;;1760421;;1760425;;1760426;;1760642;;1760654;;1770463;;1774365;;1774366;;1774394;;1774449;;1774453;;1774454;;1774455;;1774456;;1774457;;1774458;;1774461;;1774462;;1774463;;1774464;;1774466;;1774469;;1774504;;1774505;;1774506;;1774519;;1774520;;1774525;;1774527;;1774529;;1774532;;1774533;;1774539;;1774542;;1774593;;1774595;;1774604;;1774610;;1774616;;1774617;;1774641;;1774660;;1774671;;1774674;;1774684;;1774687;;1774694;;1774704;;1774706;;1774713;;1774717;;1774722;;1774723;;1774726;;1774733;;1774745;;1774750;;1774753;;1774754;;1774766;;1774784;;1774786;;1774795;;1774799;;1774800;;1774803;;1774809;;1774813;;1774835;;1774849;;1774852;;1774853;;1774854;;1774857;;1774858;;1774861;;1774862;;1774867;;1774868;;1774869;;1774870;;1774877;;1774878;;1774880;;1774884;;1774885;;1774886;;1774902;;1774905;;1774934;;1774935;;1774937;;1774939;;1774946;;1774949;;1774950;;1774958;;1774959;;1774960;;1774961;;1774962;;1774964;;1774965;;1774966;;1774967;;1774969;;1774971;;1774972;;1774973;;1774975;;1774977;;1774978;;1774999;;1775000;;1775003;;1775005;;1775006;;1775009;;1775013;;1775014;;1775017;;1775024;;1775026;;1775033;;1775038;;1775040;;1775041;;1775044;;1775087;;1785544;;1811645;;1837210;;1864356;;1928674;;1928678;;1932882;;1954203;;2066856;;2076876;;2105349;;2105351;;2105458;;2105464;;2105476;;2105480;;2105482;;2105484;;2105489;;2105496;;2105500;;2105510;;2105514;;2105518;;2105532;;2105545;;2105550;;2172257;;2172762;;218438;;2228198;;2229827;;2247909;;2262250;;2263135;;2287260;;2335872;;2335873;;2335874;;2335877;;2338682;;2352560;;2420902;;263946;;265370;;303060;;330571;;338764;;387492;;387750;;388362;;431807;;436056;;436442;;444058;;458026;;491696;;504783;;513098;;529228;;539799;;549649;;559957;;562574;;563116;;576418;;582851;;592273;;599952;;614463;;626416;;645122;;652363;;665854;;668048;;682877;;683822;;688317;;709795;;710684;;723114;;724447;;724526;;725177;;731389;;731434;;876958;;879962;;947924;;987322;;987446;;61326;;1025952;;1095970;;1338018;;1349990;;1373122;;1419930;;1760310;;1760320;;1774705;;1774706;;1774708;;1774712;;1774952;;1774954;;1774963;;1774972;;1774977;;1775077;;1901075;;2022080;;2117779;;2143723;;441554;;450517;;549649;;1010402;;113311;;1148258;;1374348;;1419930;;1606449;;1606515;;1606608;;1606610;;1760320;;1760338;;1760618;;1760642;;1774504;;1774520;;1774595;;1774705;;1774909;;1774977;;1775011;;1775043;;179542;;1928678;;2105598;;2105721;;2188303;;2335873;;340762;;387759;;436442;;504783;;588336;;646185;;682877;;715644;;725080;;741661;;760924
1)在示例中,ID的长度都相同,因此我们假设这是一个一般特征。尝试此模式,其中
(?=…)
是零宽度的先行表达式(请参见
?regex

这将列出每个
id
的次数比其在
s
中出现的次数少一次(未重复的id为零次),因此要唯一列出每个重复的id,请尝试
unique(st)
其中
st
是上面最后一行代码的结果

注意:在问题的第二个示例中,即长字符串,没有
位于字符串的末尾,因此最后一个id永远不能与表达式匹配,除非我们首先粘贴
在末尾

2)我们可以匹配分隔符,而不是匹配内容:

strsplit(s, ";")[[1]])[-1]
如果
st
是这行代码的结果,那么
st
只是所有ID的向量,因此
是唯一的(st[duplicated[st])
唯一地列出每个重复的id,并且不涉及正则表达式。

1)在示例中,id都是相同长度的,因此我们假设这是一个通用特性。尝试此模式,其中
(?=…)
是一个零宽度的前瞻表达式(请参见
?regex

这将列出每个
id
的次数比其在
s
中出现的次数少一次(未重复的id为零次),因此要唯一列出每个重复的id,请尝试
unique(st)
其中
st
是上面最后一行代码的结果

注意:在问题的第二个示例中,即长字符串,字符串末尾没有
,因此最后一个id永远不能与表达式匹配,除非我们首先将
粘贴到末尾

2)我们可以匹配分隔符,而不是匹配内容:

strsplit(s, ";")[[1]])[-1]

如果
st
是这行代码的结果,那么
st
只是所有ID的向量,因此
是唯一的(st[duplicated[st])
唯一列出每个重复的id,并且不涉及正则表达式。

谢谢,这会起作用。但我无法创建所有可能匹配项的列表,因为有些字符串太长!没问题。请提供一个示例?上面已更新。请勾选谢谢,这会起作用。但我无法创建所有可能匹配项的列表s、 因为有些字符串太长了!没问题。你能提供一个例子吗?上面更新了。请检查
pat <- ";([1-9]+);(?=.*\\1)"
gregexpr(pat, s, perl = TRUE)
library(gsubfn)
strapply(s, pat, perl = TRUE)[[1]]
## [1] "123" "123"
strsplit(s, ";")[[1]])[-1]