انجمن‌های فارسی اوبونتو

کمک و پشتیبانی => برنامه‌سازی => نویسنده: Nelliel در 05 خرداد 1395، 07:22 ب‌ظ

عنوان: الگو دادن به اسکریپت پایتون برای پیدا کردن قسمتی خاص در متن(حل شد)
ارسال شده توسط: Nelliel در 05 خرداد 1395، 07:22 ب‌ظ
سلام

دارم یه اسکریپت می‌نویسم که سورسش این شده تا الان:
#!/bin/python3

# Import needed modules
import sys
import os
import re

# clear Screen
os.system("clear")

# Get Video and Sub from Argument
subtitle = (sys.argv[1])
video = (sys.argv[2])

# Get key from user
key_ints = input("What is your Key? ")

# open file and read it
with open(subtitle, 'r') as open_read:
    for line in open_read:
        if key_ints in line:
            print(line)
           

قسمت آخر سورس ما هر کلمه‌ای را که به عنوان key_input داده ایم پیدا می‌کند برای مثال:

[hossein@ArchLinux Scripts]$ ./subvid Gods.of.Egypt.2016.1080p.WEB-DL.DD5.1.H264-RARBG.srt go.go
What is your Key? help
He'll help us with our task.

i need your help. Please!

I thought he was helping you.

please, help us!

Let me help you.

thoth for help.

But you have to help us!

I didn't want her help.

My duty was to help

I'm helping horus.

he's going to help us.

get you to help him?

Perhaps we can help her.

she's trying to help us.

i ask for your help.

want to help her.

to go help a friend.

[hossein@ArchLinux Scripts]$


حالا من می‌خوام به آن الگویی دهم که به جای این که خط را برای من چاپ کند برود و آخرین قسمت عددی را برای من چاپ کند منظورم اینه که اگر کلمه‌ی Egypt را به عنوان Key_input دادم به جای اینکه اون خط را چاپ کند عبارت 00:01:05,499 --> 00:01:08,500 را چاپ کند که آخرین خط عددی من هست, متن اصلی این است:
00:01:05,499 --> 00:01:08,500
<i> Egypt was the birthplace</i>
<i> of all life.</i>

اما اسکریپت من فقط Egypt was the birthplace را چاپ می‌کند!


عنوان: پاسخ : الگو دادن به اسکریپت پایتون برای پیدا کردن قسمتی خاص در متن
ارسال شده توسط: Geek در 05 خرداد 1395، 09:44 ب‌ظ
می‌تونی از counter استفاده کنی. (تنها راه نیست، ولی چیزی هست که سریع به ذهنم رسید...)

myfile = file("/home/geek/Desktop/mysub","r")
mystrings  = myfile.readlines()
c = 0
for i in mystrings:

if 'Egypt' in i:
print mystrings[c-1]
c = c + 1


تا جایی که تست کردم درست کارکرده...
عنوان: پاسخ : الگو دادن به اسکریپت پایتون برای پیدا کردن قسمتی خاص در متن
ارسال شده توسط: Geek در 05 خرداد 1395، 09:47 ب‌ظ
الان ۲ بار مجبور شدم کدی رو که گذاشتم اصلاح کنم! یکی اینکه حین تست Iran رو نوشته بودم و دیگه اینکه یه print c هم برای trace کردن.
عنوان: پاسخ : الگو دادن به اسکریپت پایتون برای پیدا کردن قسمتی خاص در متن
ارسال شده توسط: Nelliel در 05 خرداد 1395، 09:52 ب‌ظ
می‌تونی از counter استفاده کنی. (تنها راه نیست، ولی چیزی هست که سریع به ذهنم رسید...)

myfile = file("/home/geek/Desktop/mysub","r")
mystrings  = myfile.readlines()
c = 0
for i in mystrings:

if 'Egypt' in i:
print mystrings[c-1]
c = c + 1


تا جایی که تست کردم درست کارکرده...

بهتر نیست یک الگو باشه؟! حالا شما فکر کن مثلا عدد باشه بعد 4 خط بعدش هم جمله باشه تا دوباره به عدد برسه! این Eygpt یک مثال بود در کل دنبال راهی هستم که حجت را تمام کنه  ;)
عنوان: پاسخ : الگو دادن به اسکریپت پایتون برای پیدا کردن قسمتی خاص در متن
ارسال شده توسط: فاروق در 05 خرداد 1395، 10:07 ب‌ظ
تمام متون تگ ‏‎‎‏ و ‏‎‎‏ رو دارن؟
عنوان: پاسخ : الگو دادن به اسکریپت پایتون برای پیدا کردن قسمتی خاص در متن
ارسال شده توسط: Nelliel در 05 خرداد 1395، 10:50 ب‌ظ
تمام متون تگ ‏‎‎‏ و ‏‎‎‏ رو دارن؟

زیرنویس هستند دیگر, بله دارند البته توفیقی هم نمی‌کنه چون تابع get text را داریم :)
عنوان: پاسخ : الگو دادن به اسکریپت پایتون برای پیدا کردن قسمتی خاص در متن
ارسال شده توسط: Geek در 06 خرداد 1395، 12:28 ق‌ظ
نکته: زیرنویسی که من روش کار کردم Line Ending یونیکس/لینوکسی داشته (زیرنویس ضمیمه شد).

myaddress = '/home/geek/Desktop/mysub2'
myfile = open(myaddress,'r')
with open(myaddress) as f:
    mysum = sum(1 for _ in f)

myprimary = []
mymain = []

for i in xrange(mysum + 1):
mystr = myfile.readline()

if '-->' in mystr:
myprimary.append(mystr)

while True:
mystr = myfile.readline()
if mystr == '\n':
break
else:
myprimary.append(mystr)
mymain.append(myprimary)
myprimary = []

for i in mymain:
for j in i:
if 'biology' in j:
print i[0]





خروجی در واقع یه لیست اصلی هست که چندین زیرلیست داره و عنصر اول هرکدوم از این زیرلیست‌ها زمان شروع و خاتمه جملاتی هست که در اون لیست واقع شده!...

کد رو برای زیرنویسی که ضمیمه کردم تست کردم و نتیجه خوب بوده، حالا باید در شرایط مختلف (همون حالات خاصی که گفتید) تست بشه...

شایدم بگی اومدیم و یه جمله --> توش بود! حالا چیکار کنیم؟
فکر کنم راه حلش ساده باشه، تا جایی که من دیدم (اینم در نظر بگیر که اهل فیلم نیستم و بنابراین زیرنویس‌های کمی دیدم!!) قسمت زمان‌بندی زیرنویس یه طول مشخصی داره و همچنین --> در پوزیشن خاصی قرار می‌گیره که میشه از اینا کمک گرفت...

عنوان: پاسخ : الگو دادن به اسکریپت پایتون برای پیدا کردن قسمتی خاص در متن
ارسال شده توسط: Nelliel در 06 خرداد 1395، 11:48 ق‌ظ
سلام

کد را تبدیل کردم به پایتون 3 و اجرا کردم.

سورس:

#!/bin/python3
myaddress = '/home/hossein/Scripts/mysub2'
myfile = open(myaddress,'r')
with open(myaddress) as f:
    mysum = sum(1 for _ in f)

myprimary = []
mymain = []

for i in range(mysum + 1):
mystr = myfile.readline()

if '-->' in mystr:
myprimary.append(mystr)

while True:
mystr = myfile.readline()
if mystr == '\n':
break
else:
myprimary.append(mystr)
mymain.append(myprimary)
myprimary = []

for i in mymain:
for j in i:
if 'biology' in j:
print(i[0])


خطا:

runfile('/home/hossein/Scripts/subtest.py', wdir='/home/hossein/Scripts')
Traceback (most recent call last):

  File "<ipython-input-2-c562019338cb>", line 1, in <module>
    runfile('/home/hossein/Scripts/subtest.py', wdir='/home/hossein/Scripts')

  File "/usr/lib/python3.5/site-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 714, in runfile
    execfile(filename, namespace)

  File "/usr/lib/python3.5/site-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 89, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "/home/hossein/Scripts/subtest.py", line 5, in <module>
    mysum = sum(1 for _ in f)

  File "/home/hossein/Scripts/subtest.py", line 5, in <genexpr>
    mysum = sum(1 for _ in f)

  File "/usr/lib/python3.5/encodings/ascii.py", line 26, in decode
    return codecs.ascii_decode(input, self.errors)[0]

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 689: ordinal not in range(128)

تازه اگر کار کنه باید یه جوری اضافش کنم به اسکریپت خودم .... که فعلا این بحث را می‌ذاریم برای بعد :)
عنوان: پاسخ : الگو دادن به اسکریپت پایتون برای پیدا کردن قسمتی خاص در متن
ارسال شده توسط: Geek در 06 خرداد 1395، 12:00 ب‌ظ
پس چرا برای من داره با پایتون ۳ مثل ساعت کار می‌کنه؟
عنوان: پاسخ : الگو دادن به اسکریپت پایتون برای پیدا کردن قسمتی خاص در متن
ارسال شده توسط: Nelliel در 06 خرداد 1395، 12:03 ب‌ظ
پس چرا برای من داره با پایتون ۳ مثل ساعت کار می‌کنه؟

برای من به این خط گیر میده:

mysum = sum(1 for _ in f)
ویرایش:

جا داره همین‌ جا احسان فعالپور را صدا بزنم :)
عنوان: پاسخ : الگو دادن به اسکریپت پایتون برای پیدا کردن قسمتی خاص در متن
ارسال شده توسط: Geek در 06 خرداد 1395، 12:04 ب‌ظ
اونو الان چک می‌کنم ولی آدرس مفسر اینجا نیست؟

/usr/bin/python3
یا تو آرچ اون آدرسی هست که گذاشتی؟
عنوان: پاسخ : الگو دادن به اسکریپت پایتون برای پیدا کردن قسمتی خاص در متن
ارسال شده توسط: Geek در 06 خرداد 1395، 12:08 ب‌ظ
اون کد رو می‌تونی با این جایگزین کنی:

with open(myaddress) as f:
    mysum = len(f.readlines())
عنوان: پاسخ : الگو دادن به اسکریپت پایتون برای پیدا کردن قسمتی خاص در متن
ارسال شده توسط: Nelliel در 06 خرداد 1395، 12:11 ب‌ظ
اونو الان چک می‌کنم ولی آدرس مفسر اینجا نیست؟

/usr/bin/python3
یا تو آرچ اون آدرسی هست که گذاشتی؟

با جفتش کار می‌کنه ....
عنوان: پاسخ : الگو دادن به اسکریپت پایتون برای پیدا کردن قسمتی خاص در متن
ارسال شده توسط: hamidrezakp در 06 خرداد 1395، 12:12 ب‌ظ
سلام بفرمایید اینم برنامه :
#!/bin/python3

# Import needed modules
import sys
import os
import re

# clear Screen
os.system("clear")

# Get Video and Sub from Argument
subtitle = (sys.argv[1])
video = (sys.argv[2])

# Get key from user
key_ints = input("What is your Key? ")

# Saving line time in this variable
subLineNum = ''

# open file and read it
with open(subtitle, 'r') as open_read:
    for line in open_read:
        if "<--" in line[0:17] or "-->" in line[0:17]:
            subLineNum = line
        else:
            if key_ints in line:
                print(subLineNum)
عنوان: پاسخ : الگو دادن به اسکریپت پایتون برای پیدا کردن قسمتی خاص در متن
ارسال شده توسط: Nelliel در 06 خرداد 1395، 12:18 ب‌ظ
اون کد رو می‌تونی با این جایگزین کنی:

with open(myaddress) as f:
    mysum = len(f.readlines())


مشکل از کدینگ زیرنویس شماست با زیرنویس خودم تست کردم و سالم کار کرد :)
عنوان: پاسخ : الگو دادن به اسکریپت پایتون برای پیدا کردن قسمتی خاص در متن
ارسال شده توسط: Nelliel در 06 خرداد 1395، 12:27 ب‌ظ
سلام بفرمایید اینم برنامه :
#!/bin/python3

# Import needed modules
import sys
import os
import re

# clear Screen
os.system("clear")

# Get Video and Sub from Argument
subtitle = (sys.argv[1])
video = (sys.argv[2])

# Get key from user
key_ints = input("What is your Key? ")

# Saving line time in this variable
subLineNum = ''

# open file and read it
with open(subtitle, 'r') as open_read:
    for line in open_read:
        if "<--" in line[0:17] or "-->" in line[0:17]:
            subLineNum = line
        else:
            if key_ints in line:
                print(subLineNum)

حله ;D مرسی حمیدرضا :)

@GeeK به خاطر وقتی گذاشتید از شما هم تشکر فراوان می‌کنم :)
عنوان: پاسخ : الگو دادن به اسکریپت پایتون برای پیدا کردن قسمتی خاص در متن(حل شد)
ارسال شده توسط: Geek در 06 خرداد 1395، 12:55 ب‌ظ
یه مشکل دیگه هم هست که باید حل بشه... فرض کن ما یه همچین چیزی داشته باشیم:

2
00:00:31,080 --> 00:00:45,067
Well, Neil, we're here to talk about the poetry of science. I would say that science is the
poetry of reality

اگر برای poetry سرچ کنیم چیزی که بر می‌گرده اینه:

00:00:31,080 --> 00:00:45,067
00:00:31,080 --> 00:00:45,067

دو بار تکرار داریم.
عنوان: پاسخ : الگو دادن به اسکریپت پایتون برای پیدا کردن قسمتی خاص در متن(حل شد)
ارسال شده توسط: Nelliel در 06 خرداد 1395، 01:06 ب‌ظ
خب می‌تونیم بهش بگیم اگر یه مقدار دوبار تکرار شد فقط دفعه‌ی اول را بده (هر چند هنوز روی کد تست نکردم).
عنوان: پاسخ : الگو دادن به اسکریپت پایتون برای پیدا کردن قسمتی خاص در متن(حل شد)
ارسال شده توسط: Geek در 06 خرداد 1395، 01:16 ب‌ظ
راه حل های زیادی هست و نباید مشکلی باشه اما اینکه چطور هوشمندانه بنویسیم مهمه، خودت فکر کنم از عهده اش بربیای. ;)