రెగ్యులర్ ఎక్స్‌ప్రెషన్స్ (Regex & Pattern Matching)

🐍 Modern Python (Python 3.12+) 🎯 Chapter 10 of 25 ⚙️ Phase 02: కంట్రోల్ ఫ్లో, లూప్స్ & స్ట్రింగ్స్ 📅 2026 Edition
📌 Covered in this chapter: Regex ఆర్కిటెక్చర్ · Raw strings r"" · మెటాక్యారెక్టర్లు (^, $, ., *, +, ?, [], {}) · re.search vs match vs findall · Capturing & Named Groups · re.compile() ఆప్టిమైజేషన్ · Regex Flags (IGNORECASE, MULTILINE, VERBOSE) · ReDoS నివారణ · Enterprise KYC Verification Engine ప్రాజెక్ట్!
సాధారణ స్ట్రింగ్ మెథడ్స్ find() లేదా startswith() ఒక నిర్దిష్ట పదాన్ని వెతకడానికి సరిపోతాయి. కానీ "ఒక టెక్స్ట్‌లో ఉన్న అన్ని 10-అంకెల ఫోన్ నంబర్లను లేదా అధికారిక ఈమెయిల్ ఐడీలను వెతకండి" అన్నప్పుడు సాధారణ కోడింగ్ వందల లైన్లు పడుతుంది! ఇలాంటి సంక్లిష్టమైన టెక్స్ట్ ప్యాటర్న్‌లను కేవలం ఒకే ఒక్క లైన్‌లో వెతకడానికి, ధృవీకరించడానికి మరియు మార్చడానికి కంప్యూటర్ సైన్స్ అందించిన అద్భుతమైన గణిత సాధనమే రెగ్యులర్ ఎక్స్‌ప్రెషన్స్ (Regular Expressions / Regex). పైథాన్‌లోని re మాడ్యూల్ C-లెవల్ ఆప్టిమైజ్డ్ ఇంజిన్‌తో పనిచేస్తూ, అత్యంత వేగంగా డేటాను ఫిల్టర్ చేస్తుంది. ఈ పదవ అధ్యాయంతో మనం Phase 02: కంట్రోల్ ఫ్లో, లూప్స్ & స్ట్రింగ్స్ ను పరిపూర్ణంగా ముగిస్తూ — ఈమెయిల్, మొబైల్, పాన్‌కార్డ్, మరియు ఆధార్ నంబర్లను స్వయంచాలకంగా ధృవీకరించే పూర్తి స్థాయి Enterprise KYC & Multi-Document Verification Engine ప్రాజెక్ట్ ద్వారా Regex పై సంపూర్ణ ప్రావీణ్యాన్ని సాధిద్దాం!

1 రెగ్యులర్ ఎక్స్‌ప్రెషన్స్ అంటే ఏమిటి? (Regex Engine Architecture)

రెగ్యులర్ ఎక్స్‌ప్రెషన్ అనేది టెక్స్ట్‌లోని ఒక నిర్దిష్ట అమరికను (Text Pattern) వివరించడానికి ఉపయోగించే ఒక సంక్షిప్త సంకేత భాష. పైథాన్‌లో Regex సపోర్ట్ కోసం ఇన్-బిల్ట్ re మాడ్యూల్ ఉంది.

[పైథాన్ Regex ఇంజిన్ ఎగ్జిక్యూషన్ పైప్‌లైన్] ప్యాటర్న్ స్ట్రింగ్ టార్గెట్ టెక్స్ట్ r"^[6-9]d{9}$" "9876543210" │ │ ▼ │ ┌──────────────┐ │ │ re.compile │ (C-Level DFA/NFA) │ │ ప్యాటర్న్ బైట్‌కోడ్│ │ └──────┬───────┘ │ │ │ ▼ ▼ ┌─────────────────────────────────────────┐ │ పైథాన్ re Matching Engine │ └────────────────────┬────────────────────┘ │ ▼ ┌───────────────────────────┐ │ Match Object (or None) │ │ .group(), .start(), .end()│ └───────────────────────────┘

2 రా స్ట్రింగ్స్ ప్రాముఖ్యత (Why Raw Strings r"" are Mandatory)

సాధారణ పైథాన్ స్ట్రింగ్స్‌లో బ్యాక్‌స్లాష్ అనేది ఒక ఎస్కేప్ క్యారెక్టర్ (ఉదా: అంటే న్యూలైన్, అంటే ట్యాబ్). కానీ రెగ్యులర్ ఎక్స్‌ప్రెషన్స్‌లో కూడా d, w, s లాంటి బ్యాక్‌స్లాష్ సింబల్స్ వాడతాము.

సాధారణ స్ట్రింగ్ వాడితే బ్యాక్‌స్లాష్‌ను డబుల్ ఎస్కేప్ "\d" చేయాల్సి వస్తుంది. దీనివల్ల కోడ్ చదవడానికి వికృతంగా మారుతుంది. పరిష్కారం: స్ట్రింగ్ ముందు r (Raw String) పెట్టడం!
pattern = r"d{3}-d{4}"
రా స్ట్రింగ్ వాడినప్పుడు పైథాన్ బ్యాక్‌స్లాష్‌లను ఎస్కేప్ చేయకుండా యాజిటీజ్‌గా Regex ఇంజిన్‌కు అందజేస్తుంది.

3 ప్రాథమిక మెటాక్యారెక్టర్లు (Meta-Characters: ^, $, ., [], |)

రెగ్యులర్ ఎక్స్‌ప్రెషన్స్‌లో అక్షరాలకు ప్రత్యేక అర్థాన్ని ఇచ్చే చిహ్నాలను మెటాక్యారెక్టర్లు (Meta-characters) అంటారు:

చిహ్నం పేరు అర్థం & ప్రవర్తన ఉదాహరణ
. చుక్క (Dot / Wildcard) న్యూలైన్ తప్ప ఏదైనా ఒక్క క్యారెక్టర్‌ను మ్యాచ్ చేస్తుంది. r"p.n" matches "pan", "pin", "pen"
^ క్యారెట్ (Caret) స్ట్రింగ్ లేదా లైన్ ప్రారంభాన్ని సూచిస్తుంది. r"^Hello" ("Hello" తో మొదలవ్వాలి)
$ డాలర్ (Dollar) స్ట్రింగ్ లేదా లైన్ ముగింపును సూచిస్తుంది. r"End$" ("End" తో ముగియాలి)
[abc] క్యారెక్టర్ సెట్ బ్రాకెట్ లోపల ఉన్న అక్షరాలలో ఏ ఒక్కటైనా మ్యాచ్ అవుతుంది. r"[aeiou]" (అచ్చులు మాత్రమే)
[^abc] నెగేటివ్ సెట్ బ్రాకెట్ లోపల లేని మిగిలిన ఏ అక్షరమైనా మ్యాచ్ అవుతుంది. r"[^0-9]" (సంఖ్యలు కానివి)
A | B పైప్ (Alternation / OR) A లేదా B లలో ఏ ఒక్క ప్యాటర్న్ అయినా సరిపోలుతుంది. r"cat|dog"

4 స్పెషల్ సీక్వెన్సెస్ (d, D, w, W, s, S, )

పదే పదే [0-9] లేదా [a-zA-Z0-9_] అని పెద్ద పెద్ద రేంజెస్ రాయకుండా పైథాన్ షార్ట్‌కట్ సీక్వెన్సులను అందిస్తుంది:

సీక్వెన్స్ సమానమైన సెట్ అర్థం
d [0-9] ఏదైనా ఒక అంకె (Digit).
D [^0-9] అంకె కాని ఏదైనా అక్షరం (Non-digit).
w [a-zA-Z0-9_] ఆల్ఫాన్యూమరిక్ అక్షరం లేదా అండర్‌స్కోర్ (Word character).
W [^a-zA-Z0-9_] స్పెషల్ క్యారెక్టర్ లేదా స్పేస్ (Non-word).
s [ ] స్పేస్, ట్యాబ్ లేదా న్యూలైన్ (Whitespace).
S [^ ] ఖాళీ లేని అక్షరం (Non-whitespace).
 Word boundary పదం ప్రారంభంలో లేదా ముగింపులో ఉండే సరిహద్దు.

5 క్వాంటిఫైయర్స్ — పునరావృతం నియంత్రణ (*, +, ?, {m,n})

ఒక అక్షరం ఎన్నిసార్లు రావాలో నిర్ణయించడానికి క్వాంటిఫైయర్లను ఉపయోగిస్తాము:

6 కోడ్ డెమో 1: ప్రాథమిక మెటాక్యారెక్టర్లు & మొబైల్ నంబర్ వాలిడేటర్

భారతీయ 10-అంకెల మొబైల్ నంబర్ (6, 7, 8, 9 తో ప్రారంభమయ్యేవి) ని Regex ద్వారా ఎలా ధృవీకరించవచ్చో పరిశీలించండి:

01_indian_mobile_validator.py
# భారతీయ మొబైల్ నంబర్ వాలిడేషన్ డెమో
import re

# Regex ప్యాటర్న్ విశ్లేషణ:
# ^          -> ప్రారంభం
# (\+91[\-\s]?)? -> ఐచ్ఛిక +91 కంట్రీ కోడ్
# [6-9]      -> మొదటి అంకె 6, 7, 8 లేదా 9 మాత్రమే ఉండాలి
# \d{9}      -> మిగిలిన 9 అంకెలు (0-9)
# $          -> ముగింపు
mobile_pattern = r"^(\+91[\-\s]?)?[6-9]\d{9}$"

test_numbers = [
    "9876543210",       # ✅ సరైన నంబర్
    "+91 9123456789",   # ✅ కంట్రీ కోడ్‌తో సరైన నంబర్
    "5123456789",       # ❌ 5 తో ప్రారంభమైంది (చెల్లదు)
    "98765432",         # ❌ కేవలం 8 అంకెలు మాత్రమే
    "987654321099"      # ❌ 12 అంకెలు (చాలా పొడవు)
]

print("=== భారతీయ మొబైల్ నంబర్ ధృవీకరణ నివేదిక ===")
for num in test_numbers:
    is_valid = bool(re.match(mobile_pattern, num.strip()))
    status = "✅ సరైన మొబైల్ నంబర్" if is_valid else "❌ చెల్లని మొబైల్ నంబర్"
    print(f"నంబర్: {num:<18} ──▶ {status}")

7 పైథాన్ re మాడ్యూల్ ఫంక్షన్లు (search, match, findall, sub)

re మాడ్యూల్‌లో అత్యంత ఎక్కువగా ఉపయోగించే 5 ప్రధాన ఫంక్షన్లు:

ఫంక్షన్ ఎక్కడ వెతుకుతుంది? రిటర్న్ విలువ ఉపయోగ సందర్భం
re.match() కేవలం స్ట్రింగ్ ప్రారంభం నుండి మాత్రమే. Match ఆబ్జెక్ట్ లేదా None ఫారమ్ ఫీల్డ్ కచ్చితంగా ఆ ప్యాటర్న్‌లో ఉందో లేదో చూడటానికి.
re.search() మొత్తం స్ట్రింగ్‌లో ఎక్కడైనా మొదటి మ్యాచ్. Match ఆబ్జెక్ట్ లేదా None పారాగ్రాఫ్‌లో నిర్దిష్ట కీవర్డ్ ఎక్కడ ఉందో కనుగొనడానికి.
re.findall() మొత్తం స్ట్రింగ్‌లోని అన్ని మ్యాచ్‌లను వెతుకుతుంది. లిస్ట్ ఆఫ్ స్ట్రింగ్స్ (List) ఒక పెద్ద డాక్యుమెంట్‌లో ఉన్న అన్ని ఈమెయిళ్లను వెలికితీయడానికి.
re.finditer() అన్ని మ్యాచ్‌ల ఇటరేటర్‌ను ఇస్తుంది. Iterator of Match objects ప్రతి మ్యాచ్ యొక్క ప్రారంభ/ముగింపు స్థానాలను ట్రాక్ చేయడానికి.
re.sub() సరిపోలిన ప్యాటర్న్‌లను కొత్త పదంతో మారుస్తుంది. కొత్త స్ట్రింగ్ పాస్‌వర్డ్‌లు, ఆధార్ నంబర్లను మాస్కింగ్ చేయడానికి (XXXX-XXXX-1234).

8 క్యాప్చరింగ్ గ్రూప్స్ & నేమ్డ్ గ్రూప్స్ (Capturing & Named Groups)

ప్యాటర్న్ లోపల రౌండ్ బ్రాకెట్లు (...) పెట్టి నిర్దిష్ట భాగాలను ప్రత్యేకంగా సేకరించవచ్చు:

9 కోడ్ డెమో 2: నేమ్డ్ గ్రూప్స్ & లాగ్ రికార్డ్ పార్సింగ్

సర్వర్ లాగ్ లైన్ నుండి నేమ్డ్ గ్రూప్స్ ద్వారా IP, టైమ్‌స్టాంప్, మరియు స్టేటస్ కోడ్‌ను సంగ్రహించే కోడ్ చూడండి:

02_named_groups_log_parser.py
# నేమ్డ్ గ్రూప్స్ (Named Capturing Groups) డెమో
import re

log_entry = "2026-11-02 10:45:12 | IP: 192.168.1.105 | STATUS: 200 | URL: /api/v1/checkout"

log_regex = r"(?P\d{4}-\d{2}-\d{2})\s(?P

10 కాంపిలేషన్ ఫ్లాగ్స్ (re.IGNORECASE, re.MULTILINE, re.VERBOSE)

Regex ఇంజిన్ ప్రవర్తనను మార్చడానికి ఫ్లాగ్‌లను రెండవ లేదా మూడవ ఆర్గ్యుమెంట్‌గా పంపుతాము:

11 ప్రముఖ రియల్-వరల్డ్ రెగెక్స్ ప్యాటర్న్స్ (Email, PAN Card, Strong Password)

భారతదేశంలో మరియు అంతర్జాతీయంగా సాఫ్ట్‌వేర్ డెవలప్‌మెంట్‌లో అత్యధికంగా వాడే అధికారిక Regex ప్యాటర్న్స్:

ఫీల్డ్ పేరు ప్రామాణిక Regex ప్యాటర్న్ వివరణ & నియమాలు
ఈమెయిల్ (Email) r"^[w.-]+@[w.-]+.w{2,}$" యూజర్‌నేమ్, @ గుర్తు, డొమైన్ పేరు మరియు కనీసం 2 అక్షరాల TLD (.com, .in).
పాన్‌కార్డ్ (Indian PAN) r"^[A-Z]{5}[0-9]{4}[A-Z]$" మొదటి 5 పెద్ద అక్షరాలు, తర్వాత 4 అంకెలు, చివరగా 1 పెద్ద అక్షరం.
ఆధార్ కార్డ్ (Aadhaar) r"^[2-9]{1}d{3}sd{4}sd{4}$" 0 లేదా 1 తో మొదలుకాకూడదు; 4-4-4 అంకెలతో స్పేస్ ఇచ్చి ఉండాలి.
స్ట్రాంగ్ పాస్‌వర్డ్ (Strong Password) r"^(?=.*[a-z])(?=.*[A-Z])(?=.*d)(?=.*[@$!%*?&])[A-Za-zd@$!%*?&]{8,}$" కనీసం ఒక చిన్న అక్షరం, ఒక పెద్ద అక్షరం, ఒక అంకె, ఒక స్పెషల్ సింబల్ మరియు కనీసం 8 అక్షరాల పొడవు.
🔬 అడ్వాన్స్‌డ్ లుక్‌అహెడ్ & లుక్‌బిహైండ్ అసెర్షన్స్ (Lookahead & Lookbehind):

టెక్స్ట్‌ను కన్స్యూమ్ చేయకుండా (క్యారెక్టర్లను ముందుకు తీసుకెళ్లకుండా) కేవలం ముందు లేదా వెనుక ఒక నిర్దిష్ట పదం ఉందో లేదో తనిఖీ చేయడానికి జీరో-విడ్త్ అసెర్షన్స్ ఉపయోగిస్తాము:

  • పాజిటివ్ లుక్‌అహెడ్ (?=...): తర్వాతి స్థానంలో ఆ పదం తప్పనిసరిగా ఉండాలి (ఉదా: r"d+(?=px)" కేవలం "100px" లోని 100 ను మాత్రమే మ్యాచ్ చేస్తుంది).
  • నెగటివ్ లుక్‌అహెడ్ (?!...): తర్వాతి స్థానంలో ఆ పదం ఉండకూడదు.
  • పాజిటివ్ లుక్‌బిహైండ్ (?<=...): మునుపటి స్థానంలో ఆ పదం ఉండాలి (ఉదా: r"(?<=₹)d+" కరెన్సీ సింబల్ పక్కన ఉన్న సంఖ్యను మాత్రమే లాగుతుంది).
  • నెగటివ్ లుక్‌బిహైండ్ (?<!...): మునుపటి స్థానంలో ఆ పదం ఉండకూడదు.

12 కామన్ బిగినర్స్ మిస్టేక్స్ & ReDoS సైబర్ వాలనరబిలిటీ

13 రియల్-వరల్డ్ ప్రాజెక్ట్: "Enterprise Multi-Document KYC Verification Engine"

ఈ పదవ అధ్యాయంలో నేర్చుకున్న అన్ని అంశాలను (మెటాక్యారెక్టర్లు, క్వాంటిఫైయర్స్, re.search, findall, sub, నేమ్డ్ గ్రూప్స్, మాస్కింగ్) కలగలిపి — ఒక బ్యాంకింగ్ కస్టమర్ యొక్క ఈమెయిల్, మొబైల్, పాన్‌కార్డ్, ఆధార్ నంబర్లను తనిఖీ చేసి సురక్షితమైన డిజిటల్ KYC సర్టిఫికెట్ తయారుచేసే Enterprise Multi-Document KYC Verification Engine ను నిర్మిద్దాం!

03_enterprise_kyc_verification_engine.py
# =====================================================================
# చాప్టర్ 10 మినీ ప్రాజెక్ట్: Enterprise Multi-Document KYC Engine
# కాన్సెప్ట్స్: re.compile(), re.match(), re.sub() Masking,
#             Email, PAN, Mobile, Aadhaar Validation & Compliance Audit
# =====================================================================
import re

# ప్రీ-కంపైల్డ్ Regex ప్యాటర్న్స్ (గరిష్ట వేగం కోసం)
PATTERNS = {
    "email": re.compile(r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+$"),
    "mobile": re.compile(r"^(\+91[\-\s]?)?[6-9]\d{9}$"),
    "pan": re.compile(r"^[A-Z]{5}[0-9]{4}[A-Z]$"),
    "aadhaar": re.compile(r"^[2-9]\d{3}\s\d{4}\s\d{4}$")
}

def verify_customer_kyc(profile: dict):
    """
    కస్టమర్ పత్రాలను ధృవీకరించి అధికారిక KYC నివేదికను రూపొందిస్తుంది.
    """
    print("\n" + "=" * 74)
    print(f"{'🏛️ మన డిజిటల్ బ్యాంక్ — ఆటోమేటెడ్ KYC ధృవీకరణ నివేదిక 2026':^74}")
    print("=" * 74)
    print(f"దరఖాస్తుదారుని పేరు : {profile['name']}")
    print("-" * 74)
    print(f"{'డాక్యుమెంట్ రకం':<20} {'నమోదైన విలువ':<22} {'ధృవీకరణ ఫలితం':<28}")
    print("-" * 74)

    all_verified = True

    # 1. ఈమెయిల్ చెక్
    email_ok = bool(PATTERNS["email"].match(profile["email"].strip()))
    status_email = "✅ అధీకృత ఈమెయిల్" if email_ok else "❌ చెల్లని ఈమెయిల్ ఫార్మాట్"
    print(f"{'ఈమెయిల్ (Email)':<20} {profile['email']:<22} {status_email:<28}")
    if not email_ok: all_verified = False

    # 2. మొబైల్ చెక్
    mobile_ok = bool(PATTERNS["mobile"].match(profile["mobile"].strip()))
    status_mobile = "✅ సరైన భారతీయ మొబైల్" if mobile_ok else "❌ చెల్లని మొబైల్ నంబర్"
    print(f"{'మొబైల్ నంబర్':<20} {profile['mobile']:<22} {status_mobile:<28}")
    if not mobile_ok: all_verified = False

    # 3. పాన్‌కార్డ్ చెక్
    pan_ok = bool(PATTERNS["pan"].match(profile["pan"].strip().upper()))
    status_pan = "✅ NSDL వెరిఫైడ్ PAN" if pan_ok else "❌ చెల్లని PAN కార్డ్ నంబర్"
    print(f"{'పాన్‌కార్డ్ (PAN)':<20} {profile['pan'].upper():<22} {status_pan:<28}")
    if not pan_ok: all_verified = False

    # 4. ఆధార్ చెక్ & మాస్కింగ్ (UIDAI నిబంధనల ప్రకారం మొదటి 8 అంకెలు దాచాలి)
    aadhaar_raw = profile["aadhaar"].strip()
    aadhaar_ok = bool(PATTERNS["aadhaar"].match(aadhaar_raw))
    masked_aadhaar = re.sub(r"^\d{4}\s\d{4}", "XXXX XXXX", aadhaar_raw) if aadhaar_ok else aadhaar_raw
    status_aadhaar = "✅ UIDAI వెరిఫైడ్ & మాస్క్డ్" if aadhaar_ok else "❌ చెల్లని ఆధార్ నంబర్"
    print(f"{'ఆధార్ కార్డ్':<20} {masked_aadhaar:<22} {status_aadhaar:<28}")
    if not aadhaar_ok: all_verified = False

    print("=" * 74)
    if all_verified:
        print(f"{'🎉 అభినందనలు! మీ KYC విజయవంతంగా ఆమోదించబడింది (KYC_STATUS: APPROVED)':^74}")
    else:
        print(f"{'⚠️ హెచ్చరిక: కొన్ని పత్రాలు చెల్లవు. దయచేసి వివరాలను సరిచూసుకోండి (REJECTED)':^74}")
    print("=" * 74 + "\n")

# లైవ్ రన్ టెస్ట్
test_profile = {
    "name": "బాలాజీ రావు",
    "email": "balaji.tech@ourcompiler.com",
    "mobile": "+91 9876543210",
    "pan": "ABCDE1234F",
    "aadhaar": "4521 8901 2345"
}

verify_customer_kyc(test_profile)

★ ఈ అధ్యాయంపై ప్రాక్టీస్ క్విజ్ (Knowledge Check)

1. Regex లో Raw String (r"...") ప్రిఫిక్స్ ఎందుకు తప్పనిసరిగా వాడాలి?
సమాధానం: సాధారణ స్ట్రింగ్స్‌లో బ్యాక్‌స్లాష్ ఎస్కేప్ క్యారెక్టర్‌గా పనిచేస్తుంది. రా స్ట్రింగ్ r"" వాడకపోతే లేదా  వంటి Regex సీక్వెన్సులను పైథాన్ తన సాధారణ ఎస్కేప్ కోడ్‌లుగా భావించి గందరగోళానికి గురవుతుంది. రా స్ట్రింగ్ బ్యాక్‌స్లాష్‌లను యాజిటీజ్‌గా Regex ఇంజిన్‌కు చేరుస్తుంది.
2. re.match() కి మరియు re.search() కి మధ్య తేడా ఏమిటి?
సమాధానం: re.match() అనేది కేవలం స్ట్రింగ్ యొక్క మొదటి అక్షరం నుండి మాత్రమే ప్యాటర్న్ సరిపోతుందో లేదో చూస్తుంది. కానీ re.search() మొత్తం స్ట్రింగ్‌లో ఎక్కడైనా మొదటి మ్యాచ్‌ను వెతికి పట్టుకుంటుంది.
3. re.compile() ఫంక్షన్‌ను ఎప్పుడు వాడాలి?
సమాధానం: ఒకే Regex ప్యాటర్న్‌ను లూప్‌లో పదే పదే లక్షలాది లైన్లపై పరీక్షించాల్సి వచ్చినప్పుడు re.compile() ద్వారా ప్యాటర్న్‌ను ముందుగానే బైట్‌కోడ్‌గా మార్చుకుంటే, ప్రతి రౌండ్‌లో ప్యాటర్న్‌ను మళ్లీ పార్స్ చేయాల్సిన అవసరం లేకుండా ఎగ్జిక్యూషన్ వేగం గణనీయంగా పెరుగుతుంది.
4. Regex లో నేమ్డ్ గ్రూప్స్ (?P...) వల్ల కలిగే ప్రయోజనం ఏమిటి?
సమాధానం: సంఖ్యల ద్వారా (ఉదా: group(1), group(2)) డేటాను పొందడం కంటే, అర్థవంతమైన పేర్లతో (ఉదా: group("year")) పొందడం వల్ల కోడ్ రీడబిలిటీ పెరుగుతుంది. అంతేకాకుండా match.groupdict() ద్వారా అన్ని గ్రూప్‌లను నేరుగా ఒక పైథాన్ డిక్షనరీగా సులభంగా పొందవచ్చు.
5. ReDoS అంటే ఏమిటి? దీనిని ఎలా నివారించవచ్చు?
సమాధానం: Regular Expression Denial of Service (ReDoS) అనేది ఒక సైబర్ ముప్పు. నెస్టెడ్ క్వాంటిఫైయర్స్ ఉన్నప్పుడు సరిపోలని డేటా వస్తే Regex ఇంజిన్ ఎక్స్‌పోనెన్షియల్ బ్యాక్‌ట్రాకింగ్ లోకి వెళ్లి సర్వర్ CPU ని 100% చేసి క్రాష్ చేస్తుంది. దీనిని నివారించడానికి నెస్టెడ్ లూపింగ్ ప్యాటర్న్స్ నివారించాలి మరియు స్ట్రింగ్ పొడవుపై పరిమితులు విధించాలి.
← మునుపటి అధ్యాయం: 9. స్ట్రింగ్స్ డీప్ డైవ్ & స్లైసింగ్ తర్వాతి అధ్యాయం: 11. లిస్ట్‌లు & లిస్ట్ మెథడ్స్ →

ఈ Enterprise KYC Engine ని లైవ్‌గా మన కంపైలర్‌లో రన్ చేయండి!

ఎటువంటి లోకల్ సెటప్ లేకుండా, బ్రౌజర్‌లోనే Modern Python 3 కంపైలర్‌లో ఈ కోడ్‌ను ఎగ్జిక్యూట్ చేసి అవుట్‌పుట్ తనిఖీ చేయండి.