Regex не работает в R, работает в Regex 101 - PullRequest
0 голосов
/ 04 ноября 2019

Вот регулярное выражение, дающее ожидаемый результат в regex101:

https://regex101.com/r/Xt2mPR/1

Вот регулярное выражение, терпящее неудачу в R:

str = "<li>\n<a href=\"/kegg-bin/show_pathway?157287994040797/ko00998.args\" target=\"_blank\">ko00998</a> Biosynthesis of secondary metabolites - other antibiotics (<a href=\"javascript:display('ko00998')\">1</a>)\n<div id=\"objectko00998\" class=\"object\">\n  <a href=\"/dbget-bin/www_bget?ko:K02078\" target=\"_blank\">ko:K02078</a> acpP; acyl carrier protein\n</div>\n</li>"
print(str)
#> [1] "<li>\n<a href=\"/kegg-bin/show_pathway?157287994040797/ko00998.args\" target=\"_blank\">ko00998</a> Biosynthesis of secondary metabolites - other antibiotics (<a href=\"javascript:display('ko00998')\">1</a>)\n<div id=\"objectko00998\" class=\"object\">\n  <a href=\"/dbget-bin/www_bget?ko:K02078\" target=\"_blank\">ko:K02078</a> acpP; acyl carrier protein\n</div>\n</li>"

grep('\\/a>(.*)\\(<a', '\\1', str)
#> integer(0)
grep('\\/a>(.*)\\(<a', '\\1', str, perl=T)
#> integer(0)

Созданона 2019-11-04 по представьте пакет (v0.3.0)

Я хочу, чтобы текст: "Биосинтез вторичных метаболитов - другие антибиотики"

РЕДАКТИРОВАТЬ:

Код, который я использовал для получения строки:

> scraped = read_html('https://www.genome.jp/kegg-bin/search_pathway_object?org_name=ko&amp;unclassified=K02078')
> scraped %>% html_node('.box2') %>% html_nodes('li') %>% .[[1]] %>% as.character()
[1] "<li>\n<a href=\"/kegg-bin/show_pathway?157288982462113/ko00998.args\" target=\"_blank\">ko00998</a> Biosynthesis of secondary metabolites - other antibiotics (<a href=\"javascript:display('ko00998')\">1</a>)\n<div id=\"objectko00998\" class=\"object\">\n  <a href=\"/dbget-bin/www_bget?ko:K02078\" target=\"_blank\">ko:K02078</a> acpP; acyl carrier protein\n</div>\n</li>"

РЕДАКТИРОВАТЬ 2

Спасибо за помощь. Я использовал это здесь: https://github.com/ohsu-microbiome/kegg_http_tools

Ответы [ 2 ]

3 голосов
/ 04 ноября 2019

Вы должны использовать sub вместо grep (grep возвращает индексы совпадений) для извлечения строк и не использовать аргумент perl. Я также изменил регулярное выражение, чтобы заменить всю строку нужной подстрокой, и я использую s вместо str в качестве имени переменной, потому что str - это имя функции.

sub(".*?/a>(.*?)\\(<a.*", '\\1', s)

# [1] " Biosynthesis of secondary metabolites - other antibiotics "
0 голосов
/ 04 ноября 2019

Как сказал @MrFlick, если вы анализируете HTML, вам лучше использовать пакет rvest.

В этом случае вы можете использовать функцию regexec вместе с regmatches дляполучить также все группы захвата:

regmatches(str, regexec('\\/a>(.*)\\(<a', str))
[[1]]
[1] "/a> Biosynthesis of secondary metabolites - other antibiotics (<a"
[2] " Biosynthesis of secondary metabolites - other antibiotics " 

Это соответствует выводу regex101: полное совпадение, а также совпадение первой группы захвата. Затем вы можете индексировать по [2], чтобы получить нужную подстроку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...