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

时间:2013-10-20 12:39:11

标签: 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;;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

2 个答案:

答案 0 :(得分:2)

 m<-gregexpr("[0-9]+",s)
n<-regmatches(s,m)
[[1]]
[1] "123" "123" "456" "124" "123" "567"


data.frame(table(unlist(n)))
  Var1 Freq
1  123    3
2  124    1
3  456    1
4  567    1

该代码也适用于您的长格式字符串:以下是输出的headtail

head(data.frame(table(unlist(n))),10)
      Var1 Freq
1   100095    1
2  1003838    1
3  1010402    1
4  1025952    1
5  1045582    1
6  1079057    1
7  1095970    1
8  1108697    1
9   113311    1
10 1148258    1

tail(data.frame(table(unlist(n))),10)
       Var1 Freq
316  731434    2
317  741661    1
318  754522    1
319  760924    1
320 7693856    1
321  876958    1
322  879962    1
323  947924    1
324  987322    1
325  987446    1

答案 1 :(得分:2)

1)在示例中,id的长度都相同,因此我们假设这是一般特征。尝试这种模式,其中(?=...)是零宽度超前表达式(请参阅?regex

pat <- ";([1-9]+);(?=.*\\1)"
gregexpr(pat, s, perl = TRUE)

或者这个:

library(gsubfn)
strapply(s, pat, perl = TRUE)[[1]]
## [1] "123" "123"

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

注意:在问题的第二个例子中,即长字符串,字符串末尾没有;,因此表达式永远不能匹配最后一个id除非我们先将strsplit(s, ";")[[1]])[-1] 粘贴到最后。

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

st

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

相关问题