Pertanyaan stringr, str_extract: bagaimana melakukan lookbe positif?


Masalah yang sangat sederhana. Saya hanya perlu menangkap beberapa string menggunakan regex positive lookbehind, tetapi saya tidak melihat cara untuk melakukannya.

Berikut ini contohnya, misalkan saya memiliki beberapa string:

library(stringr)
myStrings <- c("MFG: acme", "something else", "MFG: initech")

Saya ingin mengekstrak kata-kata yang diawali dengan "MFG:"

> result_1  <- str_extract(myStrings,"MFG\\s*:\\s*\\w+")
>
> result_1
[1] "MFG: acme"    NA             "MFG: initech"

Bahwa hampir apakah itu, tapi saya tidak ingin menyertakan bagian "MFG:", jadi itulah "tampilan positif" untuk:

> result_2  <- str_extract(myStrings,"(?<=MFG\\s*:\\s*)\\w+")
Error in stri_extract_first_regex(string, pattern, opts_regex = attr(pattern,  : 
  Look-Behind pattern matches must have a bounded maximum length. (U_REGEX_LOOK_BEHIND_LIMIT)
> 

Ini mengeluh tentang membutuhkan "panjang maksimum terbatas", tapi saya tidak melihat di mana untuk menentukan itu. Bagaimana cara saya membuat pekerjaan yang terlihat positif? Di mana tepatnya, dapatkah saya menetapkan "panjang maksimum terbatas" ini?


4
2018-03-04 19:21


asal


Jawaban:


Anda perlu menggunakan str_match karena pola untuk "lookbehind" adalah literal, dan Anda tidak tahu jumlah spasi putih:

> result_1  <- str_match(myStrings,"MFG\\s*:\\s*(\\w+)")
> result_1[,2]
##[1] "acme"    NA        "initech"

Hasil yang Anda butuhkan akan berada di kolom kedua.

Perhatikan str_extract tidak dapat digunakan di sini karena fungsi itu menurunkan nilai yang ditangkap.

Dan bonus: lookbehind tidak tak terbatas, tetapi itu dibatasi lebar di ICU regex. Jadi, ini juga akan berfungsi:

> result_1  <- str_extract(myStrings,"(?<=MFG\\s{0,100}:\\s{0,100})\\w+")
> result_1
[1] "acme"    NA        "initech"

5
2018-03-04 19:23



Kami dapat menggunakan lookaround regex. Lookbehind hanya akan mengambil pertandingan yang tepat.

str_extract(myStrings, "(?<=MFG:\\s)\\w+")
#[1] "acme"    NA        "initech"

1
2018-03-04 19:22