मान लें कि मेरे पास निम्न स्ट्रिंग है:

txt = 'the car is running, the car has wheels, wheels are round, the road is clear, wheels make the car go'

मैं जो करने की कोशिश कर रहा हूं वह सभी वाक्य (जो अल्पविराम के बीच है) प्राप्त करें जिनमें या तो 'कार' या 'पहिए' हों। रेगेक्स का उपयोग करके, मैंने निम्न कार्य किया:

re.findall('[^,]*{}|{}[^,]*'.format('car', 'wheels'), txt)

और मुझे यह परिणाम मिलता है:

['the car', ' the car', 'wheels', 'wheels are round', ' wheels make the car']

जाहिर है, यह केवल वही देता है जो 'कार' और 'पहिए' शब्दों के बीच है, और ऐसा लगता है कि आदेश मायने रखता है। मैं जो पाने की कोशिश कर रहा हूं वह यह है:

['the car is running', 'the car has wheels', 'wheels are round', 'wheels make the car go']

इसे कैसे करें इसके बारे में कोई विचार?

1
Saad Cherkaoui Ikbal 16 जिंदा 2022, 14:38
कृपया अपना वांछित आउटपुट दें
 – 
Tal Folkman
16 जिंदा 2022, 14:40
मैंने अभी इसे जोड़ा है
 – 
Saad Cherkaoui Ikbal
16 जिंदा 2022, 14:42

4 जवाब

सबसे बढ़िया उत्तर

आपका रेगेक्स

re.findall('[^,]*{}|{}[^,]*'.format('car', 'wheels'), txt)

केवल एक छोटे से संशोधन की आवश्यकता है, एक (गैर-कैप्चरिंग) समूह को शामिल करना, अन्यथा | केवल car|wheels के विपरीत, पूरे रेगेक्स पर लागू होता है।

आपका नया रेगेक्स होगा

re.findall('[^,]*(?:{}|{})[^,]*'.format('car', 'wheels'), txt)

यह आउटपुट:

['the car is running', ' the car has wheels', ' wheels are round', ' wheels make the car go']

हालांकि, मुझे नहीं लगता कि रेगेक्स इस समस्या के लिए उपयुक्त है। मैं इसके बजाय निम्नलिखित समाधान की सलाह दूंगा:

txt = 'the car is running, the car has wheels, wheels are round, the road is clear, wheels make the car go'
# Either:
sentences = [sentence.strip() for sentence in txt.split(",") if "car" in sentence or "wheels" in sentence]
# Or alternatively:
words = ["car", "wheels"]
sentences = [
    sentence.strip() # Remove spaces before and after the sentence
    for sentence in txt.split(",")
    if any(
        word in sentence
        for word in words
    )
]
# This second method allows for checking for more than just 2 words

यह आउटपुट:

['the car is running', 'the car has wheels', 'wheels are round', 'wheels make the car go']

प्रदर्शन

दो विधियों (सूची समझ और रेगेक्स) के प्रदर्शन की तुलना निम्न स्क्रिप्ट से की जा सकती है, जो 40k वाक्यों वाले पाठ के लिए कोड को 100 बार स्ट्रिंग्स में चलाता है।

import timeit
import re

# Set up a testing text with 40k sentences.
txt = (
    "the car is running, the car has wheels, wheels are round, the road is clear, "
    * 10000
)

# The (simple) list comprehension strategy
list_comp_time = timeit.timeit(
    '[sentence for sentence in txt.split(",") if "car" in sentence or "wheels" in sentence]',
    globals=globals(),
    number=100,
)

# A strategy using regex
regex_time = timeit.timeit(
    "re.findall('[^,]*(?:{}|{})[^,]*'.format('car', 'wheels'), txt)",
    globals=globals(),
    number=100,
)

print(f"The List Comprehension method took {list_comp_time:.8f}s")
print(f"The Regex method took {regex_time:.8f}s")

आउटपुट है:

The List Comprehension method took 0.48497320s
The Regex method took 3.71355870s

दूसरे शब्दों में, सूची समझ पद्धति अधिक समय-कुशल है।

2
Tom Aarsen 16 जिंदा 2022, 15:05
क्या इस दृष्टिकोण में रेगेक्स की तुलना में अधिक समय नहीं लगेगा? मैं इसे एक बड़े डेटा सेट पर कर रहा हूं और मुझे डर है कि इस तरह से सूचियां बनाना और उनमें हेरफेर करना थोड़ा धीमा हो सकता है
 – 
Saad Cherkaoui Ikbal
16 जिंदा 2022, 14:56
ऐसा नहीं। साधारण सूची समझ की तुलना में रेगेक्स विशेष रूप से समय-कुशल नहीं है। अधिक जानकारी के लिए मेरा पिछला संपादन देखें।
 – 
Tom Aarsen
16 जिंदा 2022, 15:02
हां, यह मेरे लिए चीजों को साफ करता है, आपकी मदद के लिए धन्यवाद
 – 
Saad Cherkaoui Ikbal
16 जिंदा 2022, 15:03
import re

txt = 'the car is running, the car has wheels, wheels are round, the road is clear, wheels make the car go'

print(re.findall(r"(?<!,)[^,]*(?:car|wheels)[^,]*", txt))

आउटपुट:

['the car is running', 'the car has wheels', 'wheels are round', 'wheels make the car go']
1
pppig 16 जिंदा 2022, 14:49
हाँ ठीक यही मैं खोज रहा हूँ। आपको धन्यवाद
 – 
Saad Cherkaoui Ikbal
16 जिंदा 2022, 14:54

यह दृष्टिकोण मदद कर सकता है लेकिन regex के किसी भी उपयोग के बिना:

txt = 'the car is running, the car has wheels, wheels are round, the road is clear, wheels make the car go'

result = [ x for x in txt.split(',') if "car" in x or "wheel" in x]

print(result)

आउटपुट:

['the car is running', ' the car has wheels', ' wheels are round', ' wheels make the car go']
1
Bemwa Malak 16 जिंदा 2022, 15:01
1
any(…) का प्रयोग करें, अन्यथा +1।
 – 
Jan
16 जिंदा 2022, 14:52
समस्या यह है कि मैं इसे एक बड़े डेटा सेट पर कर रहा हूं, मुझे चिंता है कि रेगेक्स की तुलना में इस दृष्टिकोण में कुछ समय लग सकता है
 – 
Saad Cherkaoui Ikbal
16 जिंदा 2022, 14:54
import re
txt = 'the car is running, the car has wheels, wheels are round, the road is clear, wheels make the car go'
b = [a for a in txt.split(',') if re.findall(r'car|wheels', a)]
print(b)
0
Script Developer 16 जिंदा 2022, 14:48
ऐसा लगता है कि यह ठीक काम करता है, धन्यवाद, लेकिन क्या यह रेगेक्स से तेज़ है?
 – 
Saad Cherkaoui Ikbal
16 जिंदा 2022, 14:59