Доступ к содержимому вызываемого объекта-итератора - PullRequest
0 голосов
/ 02 апреля 2019

Я пытаюсь выполнить некоторое сопоставление регулярного выражения внутри файла, который содержит арабский текст из нескольких абзацев, но я не могу получить доступ к содержимому соответствующего объекта, мой код выглядит следующим образом:

import re 
import pandas as pd

reg =r"^[\u0621-\u064A۰-۹0-9 ]+$"

dataset =pd.read_csv('test.txt',header=None,index_col=False)
for row in dataset.itertuples():
    for pattern in enumerate(row,start=1):
        pattern=row[1].split('\n')
        print(pattern)
        matches=re.finditer(reg,pattern,re.MULTILINE)
        print(matches)

Я использую редактор spyder, который встроен в дистрибутив Anaconda для python 3.6.

Я пробовал функцию re.match, lambda x: x[1], пытаясь захватить содержимое, matches.group(), чтобы перебрать сегменты соответствия, str(pattern) и многие другие решения, но ни одно из них не сработало так, как ожидалось.

В какой-то момент мне удалось узнать, находит ли оно совпадение, и это дало мне Нет хотя я проверил, что мой файл начинается с арабских букв !!

, с другой стороны, я легко могу выполнить задачу, когда простой текст напрямую передается поисковику в виде строки !!

import re 
import pandas as pd

reg =r"^[\u0621-\u064A۰-۹0-9 ]+$"

test= ("هو الذي يصوركم في الأرحام كيف يشاء لا إله إلا هو العزيز الحكيم \n"
        "ربنا إنك جامع الناس ليوم لا ريب فيه إن الله لا يخلف الميعاد \n"
       "الصابرين والصادقين والقانتين والمنفقين والمستغفرين بالأسحار \n"
      "0123456789 \n")

#Specifying encoding and text behavior
match=re.finditer(reg,test, re.MULTILINE)
print (match)

#looping over lines inside text
for matchNum, match in enumerate(match, start=1):
    print("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group()))

    for groupNum in range(0, len(match.groups())):
        groupNum = groupNum + 1
        print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum)))

и вывод в порядке, как и ожидалось:

runfile('C:/Users/Al-Hammad/Documents/PhD/Second Year 2018-2019/Spring Semester 2018-2019/NLP/Assignments/Assignment 1/Arabic NLP.py', wdir='C:/Users/Al-Hammad/Documents/PhD/Second Year 2018-2019/Spring Semester 2018-2019/NLP/Assignments/Assignment 1')
<callable_iterator object at 0x000000000B285BA8>
Match 1 was found at 0-63: هو الذي يصوركم في الأرحام كيف يشاء لا إله إلا هو العزيز الحكيم 
Match 2 was found at 64-124: ربنا إنك جامع الناس ليوم لا ريب فيه إن الله لا يخلف الميعاد 
Match 3 was found at 125-185: الصابرين والصادقين والقانتين والمنفقين والمستغفرين بالأسحار 
Match 4 was found at 186-197: 0123456789 

вывод первого кода должен совпадать с найденным в тестовом файле, это может быть что-то вроде: ['العربية لغة رسمية في كل دول الوطن العربي إضافة إلى كونها لغة رسمية في تشاد وإريتريا وإسرائيل. وهي إحدى اللغات الرسمية الست في منظمة الأمم المتحدة، ويُحتفل باليوم العالمي للغة العربية في 18 ديسمبر كذكرى اعتماد العربية بين لغات العمل في الأمم المتحدة.[7]']

но это дает мне эту ошибку и не переходит к другим параграфам:

runfile('C:/Users/Al-Hammad/Documents/PhD/Second Year 2018-2019/Spring Semester 2018-2019/NLP/Assignments/Assignment 1/1-4-2019.py', wdir='C:/Users/Al-Hammad/Documents/PhD/Second Year 2018-2019/Spring Semester 2018-2019/NLP/Assignments/Assignment 1')
['اللُّغَة العَرَبِيّة هي أكثر اللغات تحدثاً ونطقاً ضمن مجموعة اللغات السامية، وإحدى أكثر اللغات انتشاراً في العالم، يتحدثها أكثر من 467 مليون نسمة،[4](1) ويتوزع متحدثوها في الوطن العربي، بالإضافة إلى العديد من المناطق الأخرى المجاورة كالأحواز وتركيا وتشاد ومالي والسنغال وإرتيريا وإثيوبيا وجنوب السودان وإيران. اللغة العربية ذات أهمية قصوى لدى المسلمين، فهي عندهم لغة مقدسة إذ أنها لغة القرآن، وهي لغة الصلاة وأساسية في القيام بالعديد من العبادات والشعائر الإسلامية.[5][6]']
Traceback (most recent call last):

  File "<ipython-input-41-3249da970121>", line 1, in <module>
    runfile('C:/Users/Al-Hammad/Documents/PhD/Second Year 2018-2019/Spring Semester 2018-2019/NLP/Assignments/Assignment 1/1-4-2019.py', wdir='C:/Users/Al-Hammad/Documents/PhD/Second Year 2018-2019/Spring Semester 2018-2019/NLP/Assignments/Assignment 1')

  File "C:\Users\Al-Hammad\Anaconda3\envs\py36\lib\site-packages\spyder\utils\site\sitecustomize.py", line 692, in runfile
    execfile(filename, namespace)

  File "C:\Users\Al-Hammad\Anaconda3\envs\py36\lib\site-packages\spyder\utils\site\sitecustomize.py", line 101, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "C:/Users/Al-Hammad/Documents/PhD/Second Year 2018-2019/Spring Semester 2018-2019/NLP/Assignments/Assignment 1/1-4-2019.py", line 21, in <module>
    matches=re.finditer(reg,pattern,re.MULTILINE)

  File "C:\Users\Al-Hammad\Anaconda3\envs\py36\lib\re.py", line 229, in finditer
    return _compile(pattern, flags).finditer(string)

TypeError: expected string or bytes-like object

Может кто-нибудь сказать, пожалуйста, что я здесь делаю не так?

1 Ответ

0 голосов
/ 03 апреля 2019

Ваш test.txt файл, вероятно, utf-8 закодирован.Если строка test в вашем вопросе копируется в test.txt с использованием кодировки utf-8 и сохраняется, то следующий подход даст вам те же результаты:

import re 

reg = r"^[\u0621-\u064A۰-۹0-9 ]+$"

with open('test.txt', encoding='utf-8') as f_input:
    test = f_input.read()

# Looping over regex matches inside text
for match_num, match in enumerate(re.finditer(reg, test, re.MULTILINE), start=1):
    print(f"Match {match_num} was found at {match.start()}-{match.end()}: {match.group()}")

А именно, он дает следующий вывод:

Match 1 was found at 0-63: هو الذي يصوركم في الأرحام كيف يشاء لا إله إلا هو العزيز الحكيم 
Match 2 was found at 64-124: ربنا إنك جامع الناس ليوم لا ريب فيه إن الله لا يخلف الميعاد 
Match 3 was found at 125-185: الصابرين والصادقين والقانتين والمنفقين والمستغفرين بالأسحار 
Match 4 was found at 186-197: 0123456789            

Примечание: строки Python f могут использоваться для упрощения ваших операторов печати.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...