একটি নিয়মিত অভিব্যক্তি ম্যাচ এক্সট্রাক্ট


111

আমি একটি স্ট্রিং থেকে একটি সংখ্যা বের করার চেষ্টা করছি।

এবং [0-9]+স্ট্রিংয়ের মতো কিছু করুন "aaa12xxx"এবং পান "12"

আমি ভেবেছিলাম এটি এমন কিছু হবে:

> grep("[0-9]+", "aaa12xxx", value=TRUE)
[1] "aaa12xxx"

এবং তখন আমি বুঝতে পারি ...

> sub("[0-9]+", "\\1", "aaa12xxx")
[1] "aaaxxx"

তবে আমি কিছুটা প্রতিক্রিয়া পেয়েছি:

> sub("[0-9]+", "ARGH!", "aaa12xxx")
[1] "aaaARGH!xxx"

আমি একটি ছোট বিবরণ মিস করছি।

উত্তর:


167

নতুন স্ট্রিংয়ের প্যাকেজটি ব্যবহার করুন যা বিদ্যমান সমস্ত নিয়মিত এক্সপ্রেশনটি একটি সামঞ্জস্যপূর্ণ বাক্য গঠনতে চালিত করে এবং অনুপস্থিত কয়েকটি যুক্ত করে:

library(stringr)
str_locate("aaa12xxx", "[0-9]+")
#      start end
# [1,]     4   5
str_extract("aaa12xxx", "[0-9]+")
# [1] "12"

3
(প্রায়) হুবহু আমার যা প্রয়োজন, কিন্তু আমি টাইপ করতে শুরু করে ?str_extractদেখলাম str_extract_allএবং জীবন আবার ভাল হয়েছে।
ডোয়ান্ডারসন

94

' স্ট্যান্ডার্ড ফাংশনগুলি উপেক্ষা করুন ' বলার জন্য সম্ভবত কিছুটা তাড়াহুড়ো করা - ?gsubএমনকি 'আরও দেখুন' তে উল্লেখ করার জন্য সহায়তা ফাইল :

'রেজেক্সপ্রিফ', 'গ্রেজেক্সারপ্রি' এবং 'রেজেক্সেক' এর ফলাফলের উপর ভিত্তি করে ম্যাচ সাবস্ট্রিংগুলি উত্তোলনের জন্য 'রেজমেচস'।

সুতরাং এটি কাজ করবে, এবং মোটামুটি সহজ:

txt <- "aaa12xxx"
regmatches(txt,regexpr("[0-9]+",txt))
#[1] "12"


15

আপনি PERL regexs এর অলস মিলটি ব্যবহার করতে পারেন:

> sub(".*?([0-9]+).*", "\\1", "aaa12xx99",perl=TRUE)
[1] "12"

অ-অঙ্কগুলি প্রতিস্থাপনের চেষ্টা করা এক্ষেত্রে একটি ত্রুটির দিকে নিয়ে যাবে।


4
আপনি যদি কিছুটা কৃপণ ব্যবহার করতে ইচ্ছুক হন তবে পিইআরএল লাগবে না [[^ ০-৯] * ([০-৯] +)। * "
জ্যোতির্ময় ভট্টাচার্য

5

একটি উপায় হ'ল:

test <- regexpr("[0-9]+","aaa12456xxx")

এখন, নোটিশ রেজেক্সারপ আপনাকে স্ট্রিংয়ের সূচনা এবং শেষ সূচকগুলি দেয়:

    > test
[1] 4
attr(,"match.length")
[1] 5

সুতরাং আপনি সাবস্ট্রাস্ট ফাংশন সহ তথ্য ব্যবহার করতে পারেন

substr("aaa12456xxx",test,test+attr(test,"match.length")-1)

আমি নিশ্চিত যে এটি করার জন্য আরও মার্জিত উপায় আছে তবে আমি এটি খুঁজে পেতে পারি এটি সবচেয়ে দ্রুততম উপায়। বিকল্পভাবে, আপনি যা চান তা ছেড়ে দিতে চান না তা ফেলার জন্য আপনি সাব / জিএসব ব্যবহার করতে পারেন।


5

প্রতিস্থাপনে নিয়মিত প্রকাশ এবং গোষ্ঠী রেফারেন্সে ক্যাপচারিং বন্ধনী ব্যবহার করুন Use বন্ধনীগুলির যে কোনও কিছুই মনে পড়ে। তারপরে তারা প্রথম আইটেম \ 2 দ্বারা অ্যাক্সেস করতে পারে। প্রথম ব্যাকস্ল্যাশ আর-তে ব্যাকস্ল্যাশের ব্যাখ্যার হাতছাড়া করে যাতে এটি নিয়মিত এক্সপ্রেশন পার্সারে যায়।

gsub('([[:alpha:]]+)([0-9]+)([[:alpha:]]+)', '\\2', "aaa12xxx")

2

Gsubfn প্যাকেজে strapply ব্যবহার করা। স্ট্র্যাপ্লি প্রয়োগের মতো যা আরগসটি অবজেক্ট, মডিফায়ার এবং ফাংশন ব্যতীত বস্তুটি স্ট্রিংয়ের ভেক্টর (অ্যারের পরিবর্তে) এবং সংশোধক একটি নিয়মিত প্রকাশ (মার্জিনের পরিবর্তে) হয়:

library(gsubfn)
x <- c("xy13", "ab 12 cd 34 xy")
strapply(x, "\\d+", as.numeric)
# list(13, c(12, 34))

এটি x এর প্রতিটি উপাদানকে as.numeric এর মধ্য দিয়ে পাসের প্রতিটি অংশে এক বা একাধিক সংখ্যার (\ d +) মেলানোর জন্য বলে to এটি একটি তালিকা প্রদান করে যার উপাদানগুলি x এর সাথে সম্পর্কিত উপাদানগুলির ম্যাচের ভেক্টর। আউটপুটটি দেখে আমরা দেখতে পাই যে x এর প্রথম উপাদানটির একটি মিল রয়েছে যা 13 এবং এক্স এর দ্বিতীয় উপাদানটির দুটি মিল রয়েছে যা 12 এবং 34 টি more আরও তথ্যের জন্য http://gsubfn.googlecode.com দেখুন ।


1

আরেকটি সমাধান:

temp = regexpr('\\d', "aaa12xxx");
substr("aaa12xxx", temp[1], temp[1]+attr(temp,"match.length")[1])

1

এগুলির মধ্যে একটি গুরুত্বপূর্ণ পার্থক্য কোনও অ-মিলের সাথে আচরণের পদ্ধতির মধ্যে। উদাহরণস্বরূপ, রেজিমেচগুলি পদ্ধতি যদি সমস্ত অবস্থানের সাথে মিল না থাকে তবে ইনপুট হিসাবে একই দৈর্ঘ্যের একটি স্ট্রিং ফিরে না আসতে পারে

> txt <- c("aaa12xxx","xyz")

> regmatches(txt,regexpr("[0-9]+",txt)) # could cause problems

[1] "12"

> gsub("[^0-9]", "", txt)

[1] "12" ""  

> str_extract(txt, "[0-9]+")

[1] "12" NA  

1

এই প্রশ্নের একটি সমাধান

library(stringr)
str_extract_all("aaa12xxx", regex("[[:digit:]]{1,}"))
# [[1]]
# [1] "12"

[[: সংখ্যা:]] : সংখ্যা [0-9]

{1,} : কমপক্ষে 1 বার ম্যাচ করে


0

প্যাকেজের সাহায্যে unglue আমরা নিম্নোক্ত কাজ হবে:

# install.packages("unglue")
library(unglue)
unglue_vec(c("aaa12xxx", "aaaARGH!xxx"), "{prefix}{number=\\d+}{suffix}", var = "number")
#> [1] "12" NA

2019-11-06 এ ডিপেক্স প্যাকেজ (v0.3.0) দ্বারা নির্মিত

convertকোনও সংখ্যায় স্বয়ংক্রিয়ভাবে রূপান্তর করতে আর্গুমেন্টটি ব্যবহার করুন :

unglue_vec(
  c("aaa12xxx", "aaaARGH!xxx"), 
  "{prefix}{number=\\d+}{suffix}", 
  var = "number", 
  convert = TRUE)
#> [1] 12 NA

-2

আপনি আপনার রিজেক্স ফাংশনগুলি সি ++ দিয়ে লিখতে পারেন, তাদের একটি ডিএলএলে সংকলন করতে পারেন এবং তাদের আর থেকে কল করতে পারেন

    #include <regex>

    extern "C" {
    __declspec(dllexport)
    void regex_match( const char **first, char **regexStr, int *_bool)
    {
        std::cmatch _cmatch;
        const char *last = *first + strlen(*first);
        std::regex rx(*regexStr);
        bool found = false;
        found = std::regex_match(*first,last,_cmatch, rx);
        *_bool = found;
    }

__declspec(dllexport)
void regex_search_results( const char **str, const char **regexStr, int *N, char **out )
{
    std::string s(*str);
    std::regex rgx(*regexStr);
    std::smatch m;

    int i=0;
    while(std::regex_search(s,m,rgx) && i < *N) {
        strcpy(out[i],m[0].str().c_str());
        i++;
        s = m.suffix().str();
    }
}
    };

আর হিসাবে কল

dyn.load("C:\\YourPath\\RegTest.dll")
regex_match <- function(str,regstr) {
.C("regex_match",x=as.character(str),y=as.character(regstr),z=as.logical(1))$z }

regex_match("abc","a(b)c")

regex_search_results <- function(x,y,n) {
.C("regex_search_results",x=as.character(x),y=as.character(y),i=as.integer(n),z=character(n))$z }

regex_search_results("aaa12aa34xxx", "[0-9]+", 5)

4
এটি সম্পূর্ণ অপ্রয়োজনীয়। আর এর অভ্যন্তরে সহজ সমাধানের জন্য "থেলিটেলমেল" বা "রবার্ট" এর উত্তরগুলি দেখুন
ড্যানিয়েল হুপ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.