रीबस रिप्लेसमेंट पैटर्न में समूहों को कैप्चर करने के लिए बैकरेफर को संभालना


86

मैं स्ट्रिंग लेना चाहता हूं 0.71331, 52.25378और वापस लौटता हूं 0.71331,52.25378- यानी बस एक अंक, एक अल्पविराम, एक स्थान और एक अंक और अंतरिक्ष से बाहर पट्टी की तलाश करें।

यह मेरा वर्तमान कोड है:

coords = '0.71331, 52.25378'
coord_re = re.sub("(\d), (\d)", "\1,\2", coords)
print coord_re

लेकिन यह मुझे देता है 0.7133,2.25378। मैं क्या गलत कर रहा हूं?


4
चूंकि आप वास्तव में अंकों पर कब्जा नहीं करना चाहते हैं, इसलिए यह लुक-अराउंड का उपयोग करने के लिए और अधिक समझदार हो सकता है, अर्थात re.sub(r'(?<=\d), (?=\d)', ',', coords):।
ig0774

1
इस विशेष प्रश्न को regex की आवश्यकता नहीं है, प्रतिस्थापित का उपयोग करें: coords.replace(' ', '')
Gringo Suave

जवाबों:


116

आपको regex के लिए कच्चे तार का उपयोग करना चाहिए, निम्नलिखित प्रयास करें:

coord_re = re.sub(r"(\d), (\d)", r"\1,\2", coords)

आपके वर्तमान कोड के साथ, आपके प्रतिस्थापन स्ट्रिंग के बैकस्लैश अंक से बच रहे हैं, इसलिए आप सभी मैचों को समान रूप से बदल रहे हैं chr(1) + "," + chr(2):

>>> '\1,\2'
'\x01,\x02'
>>> print '\1,\2'
,
>>> print r'\1,\2'   # this is what you actually want
\1,\2

किसी भी समय आप स्ट्रिंग में बैकस्लैश छोड़ना चाहते हैं, rउपसर्ग का उपयोग करें , या प्रत्येक बैकस्लैश ( \\1,\\2) से बचें ।


2
धन्यवाद, वह दांव चल गया। इसे पढ़ने वाले किसी व्यक्ति के लिए docs.python.org/library/re.html#raw-string-notation
रिचर्ड

1
इसके अलावा क्या कच्चे तार हैं की एक बेहतर व्याख्या के लिए stackoverflow.com/questions/2081640/…
रिचर्ड

उपरोक्त उदाहरण में आप वास्तव में समूह का नाम कैसे छापेंगे? कहो, अगर समूह \1जहां xCoord कहा जाता है , क्या re.subउप-स्ट्रिंग को समूह नामों से बदलने का निर्देश देना संभव है, re.sub(r"(\d), (\d)", r"\1,\2", coords)जिसके परिणामस्वरूप स्ट्रिंग शाब्दिक थाxCoord,52.25378
zelusp

यह पायथन 3 में काम नहीं करता है। इसका उपयोग \1कुछ विचित्र यूनिकोड चरित्र के साथ करता है।
सेरिन

15

पायथन \1ASCII मान 1 के साथ एक चरित्र के रूप में व्याख्या करता है , और इसे पास करता है sub

कच्चे तार का उपयोग करें, जिसमें पायथन व्याख्या नहीं करता है \

coord_re = re.sub(r"(\d), (\d)", r"\1,\2", coords)

यह reदस्तावेज़ीकरण की शुरुआत में सही कवर किया गया है , क्या आपको अधिक जानकारी चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.