2012-12-13 12 views
7

गुणा प्रतीक "*" "टेन्सर" के साथ, और बिजली प्रतीक "^" "p_tensor" का उपयोग निम्नलिखित प्रतिस्थापन के नियमों के साथ स्थानापन्न करना चाहते हैं:एडब्ल्यूके या sed या पर्ल के साथ ऐसे प्रतिस्थापन कैसे करें?

a(k)^n --> p_tensor(n,a(k)) 
    a(i)*a(j) --> tensor(a(i),a(j)), when i=/=j 

लेकिन प्रतीक "*" एक नंबर के बीच है कि कब और एक (i), जैसे कि 3 * ए (i), हमें प्रतीक "*" रखना चाहिए जैसा कि यह है।

तो उदाहरण के लिए

,

5*a(i)*a(j)*(a(k1)+3*a(k2)) --> 5*tensor(tensor(a(i),a(j)),a(k1)+3*a(k2)) 
    a(i)^2*a(j)^2 --> tensor(p_tensor(2,a(i)),p_tensor(2,a(j))) 
    ... 

अब मैं निम्नलिखित AWK अभिव्यक्ति का उपयोग कर या sed या पर्ल पुन: प्रारूपित करना चाहते हैं:

3*a(3)^2+6*a(1)^2*(5*a(2)^2-2*a(4))+6*a(2)*a(4)+6*a(1)*(-4*a(2)*a(3)+a(5)) 

कोई भी विचार कैसे?

प्रतिस्थापन के बाद अपेक्षित परिणाम हो

3*p_tensor(2,a(3))+6*tensor(p_tensor(2,a(1)),(5*p_tensor(2,a(2))-2*a(4))+6*tensor(a(2),a(4))+6*tensor(a(1),(-4*tensor(a(2),a(3))+a(5)) 
+0

आप '' '' 'tensor' के साथ कुछ क्यों बदलते हैं, लेकिन दूसरों को नहीं? हां, पहला '3 * ए (3)^2' ऐसा लगता है कि यह 'टेंसर (3, पी_टेन्सर (2, ए (3)) होना चाहिए। – ceyko

+0

हां, मुझे इसका जिक्र करना चाहिए," टेंसर "का उपयोग केवल तभी किया जाता है प्रतीक "*" को प्रतिस्थापित करें जो दो (i) –

+0

के बीच एक बाइनरी ऑपरेटर है, मैं इसे करने के लिए एक आसान तरीका नहीं सोच सकता, खासकर उस विशेष मामले के साथ ... कम से कम किसी भी साफ तरीके से नहीं। आप चाहें एक अभिव्यक्ति वृक्ष में मूल अभिव्यक्ति को पार्स करने के लिए, और उसके बाद इसे अपने परिचालनों का उपयोग करने के लिए परिवर्तित करना। – ceyko

उत्तर

7

रेगुलर एक्सप्रेशन मनमाना नेस्टिंग ऐसा नहीं कर सकते चाहिए, और न ही उसके बाद पूर्वता और संबद्धता कर सकते हैं। इसके लिए पार्सर्स की आवश्यकता है; हालांकि, आप इस के साथ शुरू करने से करीब पर्याप्त प्राप्त कर सकते हैं:

पर्ल:

while(<>) { 
    s/(a\(\d+\))\^(\d+)/p_tensor($2,$1)/g; 
    s/(a\((\d+)\))\*(a\((\d+)\))/tensor($1, $3)/g if $2 != $4; 
    print; 
} 

जो करीब है, और आप एक ही स्तर हो जाता है। अतिरिक्त घोंसले को अतिरिक्त आवर्ती परिभाषित पैटर्न जोड़कर "फिक्र किया जा सकता है" जो आपको आवश्यक अधिकतम घोंसले की गहराई तक जाता है (अक्सर बहुत से नहीं ... अभिव्यक्तियां शायद ही कभी 3-4 स्तर अभ्यास में गहरी होती हैं, जो आपके लिए ठीक हो सकती है)।

echo "3*a(3)^2+6*a(1)^2*(5*a(2)^2-2*a(4))+6*a(2)*a(4)+6*a(1)*(-4*a(2)*a(3)+a(5))" | perl t.pl 

या कुछ इसी तरह की:

साथ यह कोशिश करो।

+0

यह अच्छा है। धन्यवाद, टोनी –

+0

@ ओसीरिसएक्सू "स्वीकार" के बारे में कैसे? :) –

+0

क्या मैं आप कर सकता था "6 * ए (1)^2 * (5 * ए (2)^2-2 * ए (4))" से "6 * टेंसर (p_tensor (2, a() के पूर्ण अनुवाद के लिए पर्ल प्रतिस्थापन नियम को लॉस्ट्रेट करें 1)), (5 * p_tensor (2, एक (2)) - 2 * एक (4)) "। वर्तमान लिपि के साथ, इसका अनुवाद "6 * p_tensor (2, ए (1)) * (5 * p_tensor (2, ए (2)) - 2 * ए (4))" में किया गया है। –