R Language
नियमित अभिव्यक्तियाँ (रेगेक्स)
खोज…
परिचय
नियमित अभिव्यक्तियाँ (जिन्हें "रेगेक्स" या "रेगेक्सपी" भी कहा जाता है) ऐसे पैटर्न को परिभाषित करती हैं, जो एक स्ट्रिंग के विरुद्ध मिलान किए जा सकते हैं। आधिकारिक आर प्रलेखन के लिए ?regex
टाइप करें और अधिक जानकारी के लिए Regex डॉक्स देखें। एसओ रेगेक्स / विषयों में सीखी जाने वाली सबसे महत्वपूर्ण 'गेटचा' यह है कि अधिकांश आर-रेगेक्स कार्यों को pattern
पैरामीटर में बचने के लिए युग्मित बैकस्लैश के उपयोग की आवश्यकता होती है।
टिप्पणियों
चरित्र वर्ग
-
"[AB]"
ए या बी हो सकता है -
"[[:alpha:]]"
कोई भी पत्र हो सकता है -
"[[:lower:]]"
किसी भी लोअर-केस अक्षर के लिए खड़ा है। ध्यान दें कि"[az]"
करीब है, लेकिन मेल नहीं खाता है, जैसे,ú
। -
"[[:upper:]]"
किसी भी ऊपरी मामले के पत्र के लिए खड़ा है। ध्यान दें कि"[AZ]"
, करीब है लेकिन मेल नहीं खाती है, जैसेÚ
। -
"[[:digit:]]"
किसी भी अंक के लिए खड़ा है: 0, 1, 2, ..., या 9 और"[0-9]"
बराबर है।
परिमाणकों
+
, *
और ?
रेगेक्स में हमेशा की तरह लागू करें। - +
मैचों में एक बार कम से कम, *
से मेल खाता है 0 या अधिक बार, और ?
मैच 0 या 1 बार।
लाइन इंडिकेटर्स का आरंभ और अंत
आप स्ट्रिंग में रेगेक्स की स्थिति निर्दिष्ट कर सकते हैं:
-
"^..."
नियमित अभिव्यक्ति को स्ट्रिंग की शुरुआत में होने के लिए मजबूर करता है -
"...$"
नियमित अभिव्यक्ति को स्ट्रिंग के अंत में होने के लिए मजबूर करता है
अन्य भाषाओं से अंतर
कृपया ध्यान दें कि R में नियमित अभिव्यक्तियाँ अक्सर अन्य भाषाओं में प्रयुक्त नियमित अभिव्यक्तियों से कभी-थोड़ी-बहुत भिन्न दिखाई देती हैं।
आर (क्योंकि डबल बैकस्लैश पलायन की आवश्यकता है
"\"
, एक बस टाइप करने के लिए की जरूरत है सबसे रेग्युलर एक्सप्रेशन इंजन में है, इसलिए, उदाहरण के लिए पहले से ही आर तार में सामान्य रूप में बचने का तात्पर्य है), पर कब्जा खाली स्थान के लिए\s
, बनाम\\s
आर में ।R में UTF-8 वर्णों को एक राजधानी U, जैसे
[\U{1F600}]
और[\U1F600]
से मिलान किया जाना चाहिए, जबकि, उदाहरण के लिए, Ruby, यह एक[\U1F600]
-केस u से मेल खाता होगा।
अतिरिक्त संसाधन
निम्नलिखित साइट reg101 आर-स्क्रिप्ट का उपयोग करने से पहले ऑनलाइन regex की जाँच करने के लिए एक अच्छी जगह है।
R Programmming wikibook में एक पृष्ठ है जो नियमित अभिव्यक्ति का उपयोग करते हुए कई उदाहरणों के साथ पाठ प्रसंस्करण के लिए समर्पित है।
व्हॉट्सएप को खत्म करना
string <- ' some text on line one;
and then some text on line two '
व्हिट्सस्पेस ट्रिमिंग
"ट्रिमिंग" व्हाट्सएप आमतौर पर एक स्ट्रिंग से अग्रणी और अनुगामी व्हाट्सएप को हटाने के लिए संदर्भित करता है। यह पिछले उदाहरणों के संयोजन का उपयोग करके किया जा सकता है। gsub
का उपयोग अग्रणी और अनुगामी दोनों मैचों में प्रतिस्थापन को बाध्य करने के लिए किया जाता है।
आर 3.2.0 से पहले
gsub(pattern = "(^ +| +$)",
replacement = "",
x = string)
[1] "some text on line one; \nand then some text on line two"
3.2.0 और उच्चतर
trimws(x = string)
[1] "some text on line one; \nand then some text on line two"
प्रमुख व्हाट्सएप को हटाना
आर 3.2.0 से पहले
sub(pattern = "^ +",
replacement = "",
x = string)
[1] "some text on line one; \nand then some text on line two "
3.2.0 और उससे अधिक
trimws(x = string,
which = "left")
[1] "some text on line one; \nand then some text on line two "
ट्रेलिंग व्हाट्सएप को हटाना
आर 3.2.0 से पहले
sub(pattern = " +$",
replacement = "",
x = string)
[1] " some text on line one; \nand then some text on line two"
3.2.0 और उच्चतर
trimws(x = string,
which = "right")
[1] " some text on line one; \nand then some text on line two"
सभी व्हाट्सएप को हटाना
gsub(pattern = "\\s",
replacement = "",
x = string)
[1] "sometextonlineone;andthensometextonlinetwo"
ध्यान दें कि इससे टैब ( \t
), newlines ( \r
और \n
), और रिक्त स्थान जैसे सफेद स्थान को भी हटा दिया जाएगा।
दिनांक को "YYYYMMDD" प्रारूप में सत्यापित करें
निम्न प्रारूप में दिनांक को उपसर्ग के रूप में उपयोग करके फाइलों को नाम देना एक आम बात है: YYYYMMDD
, उदाहरण के लिए: 20170101_results.csv
। ऐसे स्ट्रिंग प्रारूप में एक तारीख को निम्नलिखित नियमित अभिव्यक्ति का उपयोग करके सत्यापित किया जा सकता है:
\\d{4}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])
उपरोक्त अभिव्यक्ति वर्ष से तारीखों पर विचार करती है: 0000-9999
, महीनों के बीच: 01-12
और दिन 01-31
।
उदाहरण के लिए:
> grepl("\\d{4}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])", "20170101")
[1] TRUE
> grepl("\\d{4}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])", "20171206")
[1] TRUE
> grepl("\\d{4}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])", "29991231")
[1] TRUE
नोट : यह दिनांक सिंटैक्स को मान्य करता है, लेकिन हमारे पास एक गलत सिंटैक्स के साथ एक गलत तारीख हो सकती है, उदाहरण के लिए: 20170229
(2017 यह एक लीप वर्ष नहीं है)।
> grepl("\\d{4}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])", "20170229")
[1] TRUE
यदि आप किसी तिथि को मान्य करना चाहते हैं, तो यह इस उपयोगकर्ता परिभाषित फ़ंक्शन के माध्यम से किया जा सकता है:
is.Date <- function(x) {return(!is.na(as.Date(as.character(x), format = '%Y%m%d')))}
फिर
> is.Date(c("20170229", "20170101", 20170101))
[1] FALSE TRUE TRUE
यूएस स्टेटस को संक्षिप्त रूप में मान्य करें
निम्नलिखित regex
में 50 राज्य और राष्ट्रमंडल / क्षेत्र शामिल हैं (देखें www.50states.com ):
regex <- "(A[LKSZR])|(C[AOT])|(D[EC])|(F[ML])|(G[AU])|(HI)|(I[DLNA])|(K[SY])|(LA)|(M[EHDAINSOT])|(N[EVHJMYCD])|(MP)|(O[HKR])|(P[WAR])|(RI)|(S[CD])|(T[NX])|(UT)|(V[TIA])|(W[AVIY])"
उदाहरण के लिए:
> test <- c("AL", "AZ", "AR", "AJ", "AS", "DC", "FM", "GU","PW", "FL", "AJ", "AP")
> grepl(us.states.pattern, test)
[1] TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE
>
नोट :
: यदि आप केवल 50 राज्यों सत्यापित करने के लिए चाहते हैं, तो हम आर-डाटासेट का उपयोग करने की सलाह देते हैं state.abb
से state
उदाहरण के लिए,:
> data(state)
> test %in% state.abb
[1] TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE
हमें केवल 50-राज्यों के संक्षिप्त TRUE
लिए TRUE
मिलता है: AL, AZ, AR, FL
।
यूएस फोन नंबरों को मान्य करें
निम्नलिखित नियमित अभिव्यक्ति:
us.phones.regex <- "^\\s*(\\+\\s*1(-?|\\s+))*[0-9]{3}\\s*-?\\s*[0-9]{3}\\s*-?\\s*[0-9]{4}$"
फ़ोन नंबर को इस रूप में मान्य करता है: +1-xxx-xxx-xxxx
, जिसमें संख्याओं के प्रत्येक समूह के आरंभ / अंत में वैकल्पिक प्रमुख / अनुगामी रिक्त स्थान शामिल है, लेकिन बीच में नहीं, उदाहरण के लिए: +1-xxx-xxx-xx xx
मान्य नहीं है। -
सीमांकक को रिक्त स्थान से बदला जा सकता है: xxx xxx xxx
या बिना परिसीमा के: xxxxxxxxxx
। +1
उपसर्ग वैकल्पिक है।
आइए इसे जांचें:
us.phones.regex <- "^\\s*(\\+\\s*1(-?|\\s+))*[0-9]{3}\\s*-?\\s*[0-9]{3}\\s*-?\\s*[0-9]{4}$"
phones.OK <- c("305-123-4567", "305 123 4567", "+1-786-123-4567",
"+1 786 123 4567", "7861234567", "786 - 123 4567", "+ 1 786 - 123 4567")
phones.NOK <- c("124-456-78901", "124-456-789", "124-456-78 90",
"124-45 6-7890", "12 4-456-7890")
मान्य मामले:
> grepl(us.phones.regex, phones.OK)
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE
>
अमान्य मामले:
> grepl(us.phones.regex, phones.NOK)
[1] FALSE FALSE FALSE FALSE FALSE
>
नोट :
-
\\s
किसी भी स्थान, टैब या न्यूलाइन वर्ण से मेल खाता है
R regex पैटर्न में अक्षर बचाना
चूँकि R और regex दोनों एस्केप चरित्र को साझा करते हैं, "\"
, grep
, sub
, gsub
या किसी अन्य फ़ंक्शन के लिए सही पैटर्न का निर्माण जो एक पैटर्न तर्क को स्वीकार करता है, अक्सर बैकस्लैश की जोड़ी की आवश्यकता होगी। यदि आप तीन आइटम कैरेक्टर वेक्टर बनाते हैं, जिसमें एक आइटम में एक लाइनफीड, दूसरा टैब कैरेक्टर और एक भी नहीं है, और हेट इच्छा या तो लाइनफीड या टैब को 4-रिक्त स्थान में बदलना है तो निर्माण के लिए एक बैकस्लैश की आवश्यकता होती है, लेकिन मिलान के लिए tpaired backslashes:
x <- c( "a\nb", "c\td", "e f")
x # how it's stored
# [1] "a\nb" "c\td" "e f"
cat(x) # how it will be seen with cat
#a
#b c d e f
gsub(patt="\\n|\\t", repl=" ", x)
#[1] "a b" "c d" "e f"
ध्यान दें कि पैटर्न तर्क (जो कि वैकल्पिक है यदि यह पहली बार दिखाई देता है और केवल आंशिक वर्तनी की आवश्यकता है) इस दोहरीकरण या युग्मन की आवश्यकता के लिए एकमात्र तर्क है। प्रतिस्थापन तर्क से बचने के लिए आवश्यक वर्णों के दोहरीकरण की आवश्यकता नहीं होती है। यदि आप सभी लाइनफ़ीड्स और 4-स्पेस आवृत्तियों को टैब के साथ बदलना चाहते हैं तो यह होगा:
gsub("\\n| ", "\t", x)
#[1] "a\tb" "c\td" "e\tf"
पर्ल और पोसिक्स रेगेक्स के बीच अंतर
आर में कार्यान्वित नियमित अभिव्यक्तियों के दो कभी-इतने-थोड़े अलग-अलग इंजन हैं। डिफ़ॉल्ट को POSIX- संगत कहा जाता है; R में सभी regex फ़ंक्शन बाद वाले प्रकार को चालू करने के लिए एक विकल्प से भी सुसज्जित हैं: perl = TRUE
।
देखो आगे / लुक-पीछे
perl = TRUE
नियमित अभिव्यक्तियों में लुक-फॉरवर्ड और लुक- perl = TRUE
सक्षम करता है।
-
"(?<=A)B"
अक्षरB
की एक उपस्थिति से मेल खाता है, यदि यहA
से पहले है, अर्थात"ABACADABRA"
का मिलान किया जाएगा, लेकिन"abacadabra"
और"aBacadabra"
नहीं होगा।