我有以下字符串:
string = "asflkjsdhlkjsdhglk<body>Iwant\to+extr@ctth!sstr|ng<body>sdgdfsghsghsgh"
我想提取两个<body>标记之间的字符串。我想要的结果是:
<body>
substring = "<body>Iwant\to+extr@ctth!sstr|ng<body>"
请注意,两个<body>标记之间的子字符串可以包含字母、数字、标点符号和特殊字符。有什么简单的方法吗?
uubf1zoe1#
下面是正则表达式的方法:
regmatches(string, regexpr('<body>.+<body>', string))
qni6mghb2#
regex = '<body>.+?<body>'
您需要非贪婪(.+?),这样它就不会将尽可能多的<body>标记分组。如果你只使用一个没有辅助函数的正则表达式,你将需要一个捕获组来提取所需的内容,即:
.+?
regex = '(<body>.+?<body>)'
hjzp0vay3#
strsplit()可以帮助你:
>string = "asflkjsdhlkjsdhglk<body>Iwant\to+extr@ctth!sstr|ng<body>sdgdfsghsghsgh" >x = strsplit(string, '<body>', fixed = FALSE, perl = FALSE, useBytes = FALSE) [[1]] [1] "asflkjsdhlkjsdhglk" "Iwant\to+extr@ctth!sstr|ng" "sdgdfsghsghsgh" > x[[1]][2] [1] "Iwant\to+extr@ctth!sstr|ng"
当然,这给了您字符串的所有三个部分,并且不包括标记。
kupeojn64#
我相信马修和史蒂夫的回答都是可以接受的。下面是另一个解决方案:
string = "asflkjsdhlkjsdhglk<body>Iwant\to+extr@ctth!sstr|ng<body>sdgdfsghsghsgh" regmatches(string, regexpr('<body>.+<body>', string)) output = sub(".*(<body>.+<body>).*", "\\1", string) print (output)
4条答案
按热度按时间uubf1zoe1#
下面是正则表达式的方法:
qni6mghb2#
您需要非贪婪(
.+?
),这样它就不会将尽可能多的<body>
标记分组。如果你只使用一个没有辅助函数的正则表达式,你将需要一个捕获组来提取所需的内容,即:
hjzp0vay3#
strsplit()可以帮助你:
当然,这给了您字符串的所有三个部分,并且不包括标记。
kupeojn64#
我相信马修和史蒂夫的回答都是可以接受的。下面是另一个解决方案: