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

pro*_*eak 5 python regex arabic dataframe pandas

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


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 

-----------------------------
#??? ???? ? ?? ???????
#? ??? ?????? ?????
#??? ??? ??? ???? ?
#??? ??????? ? ?????
-----------------------------
Run Code Online (Sandbox Code Playgroud)

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

我也试过另一种方法,但没用

tdata.loc[tdaTa.sentences.str.contains(r"([^\w]|^)\w([^\w]|$)")]
Run Code Online (Sandbox Code Playgroud)

我们不能创建一个我们想要的字母数组(?????

dra*_*hri 3

试试这个代码:

\n\n
import pandas as pd\n\n# mocking the dataframe based on your sample data\ndf = pd.DataFrame({\'sentences\': [\n    \'\xd9\x87\xd9\x84\xd9\x88 \xd9\x83\xd9\x8a\xd9\x81\xd9\x83 \xd9\x85 \xd9\x87\xd9\x8a \xd8\xa7\xd8\xae\xd8\xa8\xd8\xa7\xd8\xb1\xd9\x83\xd9\x85\',\n    \'\xd8\xac \xd9\x84\xd9\x8a\xd8\xb4 \xd8\xa7\xd8\xaa\xd8\xa7\xd8\xae\xd8\xb1\xd8\xaa \xd8\xa7\xd9\x84\xd9\x8a\xd9\x88\xd9\x85\',\n    \'\xd9\x87\xd9\x88 \xd9\x83\xd9\x84\xd8\xb4 \xd9\x86\xd8\xb0\xd9\x84\',\n    \'\xd8\xaa\xd8\xb1\xd8\xa7 \xd8\xa7\xd9\x86\xd9\x8a \xd9\x83\xd9\x84\xd8\xb4 \xd8\xad\xd8\xa8\xd8\xa7\xd8\xa8 \xd8\xb0\',\n    \'\xd8\xa8\xd8\xa7\xd8\xa8 \xd8\xa7\xd9\x84\xd9\x85\xd8\xaf\xd8\xb1\xd8\xb3\xd8\xa9 \xd8\xa8 \xd9\x85\xd9\x81\xd8\xaa\xd9\x88\xd8\xad\',\n    \'\xd8\xa7\xd9\x84\xd8\xad\xd9\x85\xd8\xaf\xd8\xa7\xd9\x84\xd9\x84\xd9\x87 \xd8\xa7\xd9\x84\xd9\x83\xd9\x84 \xd8\xa8\xd8\xae\xd9\x8a\xd8\xb1\',\n    \'\xd9\x83\xd9\x85 \xd9\x86\xd9\x8e\xd8\xad\xd9\x86\xd9\x8f \xd9\x83\xd8\xa8\xd8\xa7\xd8\xb1  \xd9\x85\xd8\xb9 \xd9\x87\xd8\xb0\xd8\xa7 \xd9\x86\xd8\xb9\xd8\xaa\xd9\x85\xd8\xaf \xd8\xb9\xd9\x84\xd9\x89 \xd9\x88\xd8\xa7\xd9\x84\xd8\xaf\xd9\x86\xd8\xa7 \xd9\x81\xd9\x8a \xd9\x85\xd8\xb5\xd8\xb1\xd9\x88\xd9\x81\xd9\x86\xd8\xa7\',\n    \'\xd9\x83\xd9\x85 \xd9\x86\xd9\x8e\xd8\xad\xd9\x86\xd9\x8f \xd9\x83\xd8\xa8\xd8\xa7\xd8\xb1  \xd9\x85\xd8\xb9 \xd9\x87\xd8\xb0\xd8\xa7 \xd9\x84\xd8\xa7 \xd8\xaa\xd8\xb9\xd8\xb1\xd9\x81 \xd9\x83\xd9\x8a\xd9\x81\xd9\x8e \xd9\x86\xd8\xaa\xd8\xad\xd8\xaf\xd8\xab \xd8\xa8\xd8\xb7\xd8\xb1\xd9\x8a\xd9\x82\xd8\xa9 \xd9\x84\xd8\xa7\xd8\xa6\xd9\x82\xd8\xa9 \xd9\x81\xd9\x8a \xd8\xa7\xd9\x84\xd9\x85\xd8\xac\xd9\x84\xd8\xb3\',\n    \'\xd9\x83\xd9\x85 \xd9\x86\xd9\x8e\xd8\xad\xd9\x86\xd9\x8f \xd9\x83\xd8\xa8\xd8\xa7\xd8\xb1  \xd9\x85\xd8\xb9 \xd9\x87\xd8\xb0\xd8\xa7 \xd9\x84\xd8\xa7 \xd9\x86\xd8\xb9\xd8\xb1\xd9\x81 \xd9\x83\xd9\x8a\xd9\x81\xd9\x8e \xd9\x86\xd8\xb9\xd8\xa8\xd8\xb1 \xd8\xa7\xd9\x84\xd8\xb4\xd8\xa7\xd8\xb1\xd9\x90\xd8\xb9 \xd8\xa8\xd9\x85\xd9\x81\xd8\xb1\xd8\xaf\xd9\x86\xd8\xa7\',\n    \'\xd9\x84\xd9\x90\xd9\x85\xd9\x8e \xd9\x84\xd8\xa7 \xd8\xaa\xd8\xac\xd9\x81\xd9\x81\xd9\x86 \xd9\x85\xd8\xb3\xd8\xaa\xd8\xad\xd8\xb6\xd8\xb1 (\xd8\xb7\xd9\x8a\xd9\x86 \xd8\xa7\xd9\x84\xd8\xa8\xd8\xad\xd8\xb1 \xd8\xa7\xd9\x84\xd9\x85\xd9\x8a\xd8\xaa ) \xd9\x82\xd8\xa8\xd9\x84 \xd8\xa3\xd9\x86 \xd8\xaa\xd8\xb3\xd8\xaa\xd8\xae\xd8\xaf\xd9\x85\xd9\x86\xd9\x87\'\n]})\n\n# selecting sentences with a single Arabic character word using regex\npattern = \'(?<![\\u0600-\\u06ff])[\\u0600-\\u06ff](?![\\u0600-\\u06ff])\'\ndf = df[df[\'sentences\'].str.contains(pattern)]\n\nprint(df)\n#                sentences\n# 0  \xd9\x87\xd9\x84\xd9\x88 \xd9\x83\xd9\x8a\xd9\x81\xd9\x83 \xd9\x85 \xd9\x87\xd9\x8a \xd8\xa7\xd8\xae\xd8\xa8\xd8\xa7\xd8\xb1\xd9\x83\xd9\x85\n# 1     \xd8\xac \xd9\x84\xd9\x8a\xd8\xb4 \xd8\xa7\xd8\xaa\xd8\xa7\xd8\xae\xd8\xb1\xd8\xaa \xd8\xa7\xd9\x84\xd9\x8a\xd9\x88\xd9\x85\n# 3     \xd8\xaa\xd8\xb1\xd8\xa7 \xd8\xa7\xd9\x86\xd9\x8a \xd9\x83\xd9\x84\xd8\xb4 \xd8\xad\xd8\xa8\xd8\xa7\xd8\xa8 \xd8\xb0\n# 4    \xd8\xa8\xd8\xa7\xd8\xa8 \xd8\xa7\xd9\x84\xd9\x85\xd8\xaf\xd8\xb1\xd8\xb3\xd8\xa9 \xd8\xa8 \xd9\x85\xd9\x81\xd8\xaa\xd9\x88\xd8\xad\n
Run Code Online (Sandbox Code Playgroud)\n\n

正则表达式解释

\n\n
pattern = \'(?<![\\u0600-\\u06ff])[\\u0600-\\u06ff](?![\\u0600-\\u06ff])\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

[\\u0600-\\u06ff]涵盖标准阿拉伯语unicode 范围,包括字母、数字和变音符号。使用负向后查找(?<![\\u0600-\\u06ff])和负向前查找,(?![\\u0600-\\u06ff])我们将匹配限制为任何单个阿拉伯字符,该字符之前或之后都没有另一个阿拉伯字符。

\n\n

如果您想要匹配特定的字符集而不是全部,请将中间更改[\\u0600-\\u06ff]为您想要的任何字符集。例如,如果您只想匹配从 0 到 9 的阿拉伯数字,则使用[\\u0660-\\u0669]

\n\n
pattern = \'(?<![\\u0600-\\u06ff])[\\u0660-\\u0669](?![\\u0600-\\u06ff])\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
pattern = \'\\b\\w\\b\'\n
Run Code Online (Sandbox Code Playgroud)\n