from docx import Document
numbers = []
doc = Document('word.docx')
for para in doc.paragraphs:
new_text = para.text
for char in new_text:
if char in '0123456789.':
numbers.append(char)
print(new_text)
print(numbers)
*它是波斯语 docx 文件
它返回这个:
巴巴多巴和巴巴多巴 巴巴多巴 2.7 塔 3 与巴巴多巴 306 巴巴多。下一篇:没有了 � � � � � � � � � � � 巴尼奥和巴尼奥之间的关系。巴巴巴和巴巴和巴巴和巴巴。巴巴瑞巴尼亚德 巴巴巴瑞巴德 巴巴瑞巴德 巴巴巴瑞 巴巴德巴u200c巴巴德。巴布亚新几内亚和巴布亚新几内亚。巴巴利亚 74.5 比巴利亚 90 比巴巴 巴巴多。 于 10 月 15 日发布。 26 小时 26 小时
['2', '.', '7', '3', '3', '0', '6', '.', '.', '.', '.', '.', '.'、'7'、'4'、'.'、'5'、'9'、'0'、'.'、'1'、'0'、'1'、'5'、'. ', '2', '6', '.']
如您所见,它也添加了文本句点到列表中。
当然,它会捕获所有句点,因为您允许它们出现在角色列表中。不过,要识别数字,您不能只检查单个字符,还可以检查它们的组。您可以通过使用正则表达式:
来简单地做到这一点In [7]: re.findall("\d+(?:\.\d+)?", text)
Out[7]: ['2.7', '3', '306', '74.5', '90', '10', '15', '26']
(这只是一个例子,实际上您需要找到一个与您的用例匹配的模式,并且应该在使用
re.compile
之前对其进行编译。)
然后你只需转换结果即可:
In [8]: [float(x) for x in re.findall("\d+(?:\.\d+)?", text)]
Out[8]: [2.7, 3.0, 306.0, 74.5, 90.0, 10.0, 15.0, 26.0]
import docx
from unidecode import unidecode
stack = []
num = []
arabicNumbers = ["١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩", "٠"]
persianNumbers = ["۱", "۲", "۳", "۴", "۵", "۶", "۷", "۸", "۹", "۰"]
enNumbers = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '.']
s = ''
doc = docx.Document('myDoD.docx')
s = ''.join(para.text for para in doc.paragraphs)
str_ = ''
for i in s:
if i in arabicNumbers or i in persianNumbers or i.isnumeric() or i == '.' or i in '٫':
if i == '٫':
stack.append('.')
else:
stack.append(i)
else:
str_ = ''.join(i for i in stack)
stack = []
if str_ == '' or str_ == '.' or str_ == "٠" or str_ == "۰":
pass
else:
num.append(float(unidecode(str_)))
print(sum(num))