如何使用 Python 和 Pandas 查找具有单个字符的句子

How to look for sentences having single characters using Python and Pandas

我正在尝试从包含一个字符的单词的数据框中打印出句子,无论它位于句子中间或结尾的哪个位置,挑战在于我的代码非常适合英文脚本但是当我将 scrips say 更改为阿拉伯语,它会打印错误输出所有句子,而不是其中包含一个字母的所需输出。


tdata = pd.read_csv(fileinput, nrows=0).columns[0]
skip = int(tdata.count(' ') == 0)
tdata = pd.read_csv(fileinput, names=['sentences'], skiprows=skip)
df = tdata[dftdata'sentences'].str.contains(r'\b\w{1}\b')]
print(df)


a sample set
-----------------------------

#هلو كيفك م هي اخباركم
#ج ليش اتاخرت اليوم
#هو كلش نذل
#ترا اني كلش حباب ذ
#باب المدرسة ب مفتوح
#الحمدالله الكل بخير
#كم نَحنُ كبار  مع هذا نعتمد على والدنا في مصروفنا
#كم نَحنُ كبار  مع هذا لا تعرف كيفَ نتحدث بطريقة لائقة في المجلس
#كم نَحنُ كبار  مع هذا لا نعرف كيفَ نعبر الشارِع بمفردنا
#هل اهتممتم بوالدتكم  انها مسكينة قد لاحظت انها متعبة جداً ً
#كفاكُن كلام اذهبن  ادرسن َ  اجتهدن
#لِمَ لا تجففن مستحضر (طين البحر الميت ) قبل أن تستخدمنه ُ  
#  ادرسن َ  
# أعشقك ِ
#هل   ً
-----------------------------

expected output 

-----------------------------
#هلو كيفك م هي اخباركم
#ج ليش اتاخرت اليوم
#ترا اني كلش حباب ذ
#باب المدرسة ب مفتوح
-----------------------------

为什么此代码不适用于与英语相同的阿拉伯文字?

我也试过另一种方法无效

tdata.loc[tdaTa.sentences.str.contains(r"([^\w]|^)\w([^\w]|$)")]

我们不能创建一个我们想要的字母数组,例如 ( ذ ب ا م ك خ Í ) 并且当它们单独出现在一个句子中时打印那个句子不会是更好的方法和更少的头痛吗?

试试这个代码:

import pandas as pd

# mocking the dataframe based on your sample data
df = pd.DataFrame({'sentences': [
    'هلو كيفك م هي اخباركم',
    'ج ليش اتاخرت اليوم',
    'هو كلش نذل',
    'ترا اني كلش حباب ذ',
    'باب المدرسة ب مفتوح',
    'الحمدالله الكل بخير',
    'كم نَحنُ كبار  مع هذا نعتمد على والدنا في مصروفنا',
    'كم نَحنُ كبار  مع هذا لا تعرف كيفَ نتحدث بطريقة لائقة في المجلس',
    'كم نَحنُ كبار  مع هذا لا نعرف كيفَ نعبر الشارِع بمفردنا',
    'لِمَ لا تجففن مستحضر (طين البحر الميت ) قبل أن تستخدمنه'
]})

# selecting sentences with a single Arabic character word using regex
pattern = '(?<![\u0600-\u06ff])[\u0600-\u06ff](?![\u0600-\u06ff])'
df = df[df['sentences'].str.contains(pattern)]

print(df)
#                sentences
# 0  هلو كيفك م هي اخباركم
# 1     ج ليش اتاخرت اليوم
# 3     ترا اني كلش حباب ذ
# 4    باب المدرسة ب مفتوح

正则表达式解释:

pattern = '(?<![\u0600-\u06ff])[\u0600-\u06ff](?![\u0600-\u06ff])'

[\u0600-\u06ff] 涵盖标准阿拉伯语 unicode range,包括字母、数字和变音符号。使用否定后向 (?<![\u0600-\u06ff]) 和否定前瞻 (?![\u0600-\u06ff]) 我们将匹配限制为任何单个阿拉伯字符,该字符既不在另一个阿拉伯字符之前也不在其后。

如果您想要匹配一组特定的字符而不是所有字符,请将中间的 [\u0600-\u06ff] 更改为您想要的任何字符集。例如,如果您只想匹配从零到九的阿拉伯数字,则使用 [\u0660-\u0669] 代替:

pattern = '(?<![\u0600-\u06ff])[\u0660-\u0669](?![\u0600-\u06ff])'

对于英语,整个模式应该是这样的:

pattern = '\b\w\b'