2017-04-04 12 views
5

tôi đang tìm kiếm text_ đó là: Tuần này (25 Tháng Ba - 31 tháng 3), tốc độ vận hành nhà máy lọc dầu trong nước tiếp tục giảm, tổng nhà máy dầu đậu nành trên toàn quốc đè bẹp 1.456.000 tấn (một bữa ăn 1.157.520 tấn, 262.080 tấn dầu), tuần trước ... [tiếp tục]Regex với chữ Hán

crush <- str_extract(string = text_, pattern = perl("(?<=量).*(?=吨(出粕)")) 
    meal <- str_extract(string = text_, pattern = perl("(?<=粕).*(?=吨,出)")) 
    oil <- str_extract(string = text_, pattern = perl("(?<=出油).*(?=吨))")) 

in

[1] "1456000" ## correct 
[1] "1157520" ## correct 
[1] NA   ## looking for 262080 here 

Tại sao hai trận đấu đầu tiên nhưng không phải là người cuối cùng? tôi đang sử dụng các stringr thư viện.

+1

Sử dụng ' "(? <= dầu) \\ d + (? = t)"' để có được các chữ số giữa các chuỗi con mô hình thứ ba không hoạt động vì khung tròn là một. ASCII một, không phải là người Trung Quốc. –

+0

Tuy nhiên trả về 'na' –

+1

Xem https://regex101.com/r/1b1ucy/1 –

Trả lời

2

Lưu ý rằng phiên bản hiện tại của stringr gói dựa trên thư viện regex ICU, và sử dụng perl() bị phản đối.

Lưu ý rằng lookbehind mẫu được cố định chiều rộng, và có vẻ như rằng có một vấn đề với cách ICU phân tích các chữ cái đầu tiên trong mô hình lookbehind của bạn (nó không thể tính toán chiều rộng của nó đối với một số lý do nào đó).

Vì bạn đang sử dụng stringr, bạn có thể chỉ dựa vào chụp rằng có thể đạt được với str_match, để trích xuất một phần của mô hình:

> match <- str_match(s, "出油(\\d+)吨") 
> match[,2] 
[1] "262080" 

bằng cách này, bạn sẽ một làm mất hiệu lực bất kỳ vấn đề cuối cùng trong tương lai. Ngoài ra, các regexps được thực hiện nhanh hơn vì không có lookbehind unanchored trong mô hình được thực hiện tại mỗi vị trí trong chuỗi tìm kiếm.

Ngoài ra, bạn có thể chỉ cần sử dụng regex PCRE bạn với cơ sở R:

> regmatches(s, regexpr("(?<=出油)\\d+(?=吨)", s, perl=TRUE)) 
[1] "262080" 
0

Hãy thử điều này:

oil <- str_extract(string = text_, pattern = perl("(?<=出油).*(?=吨),较上周的))")) 

Bởi vì đơn giản có thể xuất hiện sau đó một lần nữa văn bản của bạn một lần nữa, có thể không chính xác định vị trí phần nào, có thể vượt quá chiều dài dữ liệu hoặc gây ra các vấn đề kiểu dữ liệu

+0

Tuy nhiên trả về 'NA '. với một số chụp rắc rối tôi đã phát hiện ra rằng vấn đề là với dầu matching''. Nếu tôi thay thế này với dầu just' ', nó sẽ trả về, dự đoán, một chuỗi dài hơn nhiều, nhưng xác định một cách chính xác sự kết thúc của chuỗi mong muốn ngay sau khi '262080'. Bất cứ ý tưởng why' dầu' không phù hợp với –

+0

? dầu has' 'xuất hiện trước văn bản dán của bạn? – LONG

+0

không, nó không có ... –

1

Đối với một số lý do, vẫn don. 't biết, tôi đã không thể sử dụng @ WiktorStribiżew' giải pháp nhận xét s, nhưng điều này đã kết thúc làm việc:

oil <- str_extract(string = text_, pattern = perl("(?<=吨).*(?=吨)")) 
# [1] "(出粕1157520吨,出油262080吨),较 
oil <- str_extract(string = oil, pattern = perl("(?<=油)\\d+(?=吨)")) 
# [1] 262080 
+0

hãy xem câu trả lời của tôi, bạn thậm chí không cần stringr, bạn có thể sử dụng regex với R. cơ sở PCRE –

Các vấn đề liên quan