StringUtil.py

説明を見る。
00001 #!/usr/bin/env python
00002 # -*- coding: euc-jp -*-
00003 
00004 ##
00005 # @file StringUtil.py
00006 # @brief String operation utility
00007 # @date $Date: $
00008 # @author Noriaki Ando <n-ando@aist.go.jp> and Shinji Kurihara
00009 #
00010 # Copyright (C) 2003-2008
00011 #     Task-intelligence Research Group,
00012 #     Intelligent Systems Research Institute,
00013 #     National Institute of
00014 #         Advanced Industrial Science and Technology (AIST), Japan
00015 #     All rights reserved.
00016 
00017 
00018 
00019 import string
00020 
00021 ##
00022 # @if jp
00023 # @brief 文字列がエスケープされているか判断する
00024 #
00025 # 指定された文字がエスケープされているかどうかを判断する。
00026 #
00027 # @param _str エスケープされているかどうか判断する文字を含む文字列
00028 # @param pos エスケープされているかどうか判断する文字の位置
00029 #
00030 # @return 指定した文字がエスケープされていれば true, それ以外は false
00031 #
00032 # @else
00033 # @brief Whether the character is escaped or not
00034 #
00035 # This operation returns true if the specified character is escaped, and
00036 # if the specified character is not escaped, it returns false
00037 #
00038 # @param str The string thath includes the character to be investigated.
00039 # @param pos The position of the character to be investigated.
00040 #
00041 # @return true: the character is escaped, false: the character is not escaped.
00042 #
00043 # @endif
00044 def isEscaped(_str, pos):
00045   pos -= 1
00046 
00047   i = 0
00048   while pos >= 0 and _str[pos] == "\\":
00049     i += 1
00050     pos -= 1
00051 
00052   return i % 2 == 1
00053 
00054 
00055 ##
00056 # @if jp
00057 # @class escape_functor
00058 # @brief  文字列エスケープ処理用functor
00059 # @else
00060 #
00061 # @endif
00062 class escape_functor:
00063   def __init__(self):
00064     self._str = ""
00065 
00066   def __call__(self,c):
00067     if   c == '\t':
00068       self._str += "\\t"
00069     elif c == '\n':
00070       self._str += "\\n"
00071     elif c == '\f':
00072       self._str += "\\f"
00073     elif c == '\r':
00074       self._str += "\\r"
00075     elif c == '\\':
00076       self._str += "\\\\"
00077     else:
00078       self._str += c
00079 
00080 
00081 ##
00082 # @if jp
00083 # @class unescape_functor
00084 # @brief  文字列アンエスケープ処理用functor
00085 # @else
00086 #
00087 # @endif
00088 class unescape_functor:
00089   def __init__(self):
00090     self.count = 0
00091     self._str = ""
00092 
00093   def __call__(self,c):
00094     if c == "\\":
00095       self.count += 1
00096       if not (self.count % 2):
00097         self._str += c
00098     else:
00099       if self.count > 0 and (self.count % 2):
00100         self.count = 0
00101         if c == 't':
00102           self._str+='\t'
00103         elif c == 'n':
00104           self._str+='\n'
00105         elif c == 'f':
00106           self._str+='\f'
00107         elif c == 'r':
00108           self._str+='\r'
00109         elif c == '\"':
00110           self._str+='\"'
00111         elif c == '\'':
00112           self._str+='\''
00113         else:
00114           self._str+=c
00115       else:
00116         self.count = 0
00117         self._str+=c
00118 
00119 
00120 ##
00121 # @if jp
00122 # @class unique_strvec
00123 # @brief  重複文字削除処理用functor
00124 # @else
00125 #
00126 # @endif
00127 class unique_strvec:
00128   def __init__(self):
00129     self._str = []
00130 
00131   def __call__(self,s):
00132     if self._str.count(s) == 0:
00133       return self._str.append(s)
00134 
00135 
00136 ##
00137 # @if jp
00138 # @brief  インスタンス生成用functor
00139 # @else
00140 #
00141 # @endif
00142 def for_each(_str, instance):
00143   for i in _str:
00144     instance(i)
00145 
00146   return instance
00147 
00148 
00149 ##
00150 # @if jp
00151 # @brief 文字列をエスケープする
00152 # 
00153 # 次の文字をエスケープシーケンスに変換する。<br>
00154 # HT -> "\t" <br>
00155 # LF -> "\n" <br>
00156 # CR -> "\r" <br>
00157 # FF -> "\f" <br>
00158 # シングルクオート、ダブルクオートについてはとくに処理はしない。
00159 # 
00160 # @else
00161 # 
00162 # @brief Escape string
00163 # 
00164 # The following characters are converted. <br>
00165 # HT -> "\t" <br>
00166 # LF -> "\n" <br>
00167 # CR -> "\r" <br>
00168 # FF -> "\f" <br>
00169 # Single quote and dobule quote are not processed.
00170 # 
00171 # @endif
00172 def escape(_str):
00173   return for_each(_str, escape_functor())._str
00174 
00175 
00176 ##
00177 # @if jp
00178 # @brief 文字列のエスケープを戻す
00179 # 
00180 # 次のエスケープシーケンスを文字に変換する。<br>
00181 # "\t" -> HT <br>
00182 # "\n" -> LF <br>
00183 # "\r" -> CR <br>
00184 # "\f" -> FF <br>
00185 # "\"" -> "  <br>
00186 # "\'" -> '  <br>
00187 # 
00188 # @else
00189 # 
00190 # @brief Unescape string
00191 # 
00192 # The following characters are converted. <br>
00193 # "\t" -> HT <br>
00194 # "\n" -> LF <br>
00195 # "\r" -> CR <br>
00196 # "\f" -> FF <br>
00197 # "\'" -> '  <br>
00198 # "\"" -> "  <br>
00199 # @endif
00200 def unescape(_str):
00201   return for_each(_str, unescape_functor())._str
00202 
00203 
00204 ##
00205 # @if jp
00206 # @brief 文字列の先頭の空白文字を削除する
00207 #
00208 # 与えられた文字列の先頭に存在する空白文字を削除する。
00209 # 空白文字として扱うのは' '(スペース)と'\\t'(タブ)。
00210 #
00211 # @param _str 先頭空白文字削除処理文字列
00212 #
00213 # @else
00214 # @brief Erase the head blank characters of string
00215 # @endif
00216 def eraseHeadBlank(_str):
00217   _str[0] = _str[0].lstrip('\t ')
00218 
00219 
00220 ##
00221 # @if jp
00222 # @brief 文字列の末尾の空白文字を削除する
00223 #
00224 # 与えられた文字列の末尾に存在する空白文字を削除する。
00225 # 空白文字として扱うのは' '(スペース)と'\\t'(タブ)。
00226 #
00227 # @param _str 末尾空白文字削除処理文字列
00228 #
00229 # @else
00230 # @brief Erase the tail blank characters of string
00231 # @endif
00232 def eraseTailBlank(_str):
00233   _str[0] = _str[0].rstrip('\t ')
00234 
00235 
00236 ##
00237 # @if jp
00238 # @brief 文字列を置き換える
00239 #
00240 # 与えられた文字列に対して、指定した文字の置き換えを行う。
00241 #
00242 # @param str 置き換え処理対象文字列
00243 # @param _from 置換元文字
00244 # @param _to 置換先文字
00245 #
00246 # @else
00247 # @brief Replace string
00248 # @endif
00249 def replaceString(str, _from, _to):
00250   str[0] = str[0].replace(_from, _to)
00251 
00252 
00253 ##
00254 # @if jp
00255 # @brief 文字列を分割文字で分割する
00256 # 
00257 # 設定された文字列を与えられたデリミタで分割する。
00258 #
00259 # @param input 分割対象文字列
00260 # @param delimiter 分割文字列(デリミタ)
00261 #
00262 # @return 文字列分割結果リスト
00263 #
00264 # @else
00265 # @brief Split string by delimiter
00266 # @endif
00267 def split(input, delimiter):
00268   if input is None:
00269     return []
00270 
00271   del_result = input.split(delimiter)
00272 
00273   len_ = len(del_result)
00274 
00275   result = []
00276   for i in range(len_):
00277     if del_result[i] == "" or del_result[i] == " ":
00278       continue
00279       
00280     str_ = [del_result[i]]
00281     eraseHeadBlank(str_)
00282     eraseTailBlank(str_)
00283     result.append(str_[0])
00284     
00285   return result
00286 
00287 
00288 ##
00289 # @if jp
00290 # @brief 与えられた文字列をbool値に変換する
00291 # 
00292 # 指定された文字列を、true表現文字列、false表現文字列と比較し、その結果を
00293 # bool値として返す。
00294 # 比較の結果、true表現文字列、false表現文字列のどちらとも一致しない場合は、
00295 # 与えられたデフォルト値を返す。
00296 #
00297 # @param _str 判断対象文字列
00298 # @param yes true表現文字列
00299 # @param no false表現文字列
00300 # @param default_value デフォルト値(デフォルト値:None)
00301 # @else
00302 # @brief Convert given string to bool value
00303 # @endif
00304 def toBool(_str, yes, no, default_value=None):
00305   if default_value is None:
00306     default_value = True
00307 
00308   _str = _str.upper()
00309   yes  = yes.upper()
00310   no   = no.upper()
00311 
00312   if _str.find(yes) != -1:
00313     return True
00314   elif (_str.find(no)) != -1:
00315     return False
00316   else:
00317     return default_value
00318 
00319 
00320 ##
00321 # @if jp
00322 # @brief 与えられた文字列が絶対パスかどうかを判断する
00323 #
00324 # 与えられた文字列が絶対パス表現であるかどうかを判断する。
00325 # 文字列が以下の場合には絶対パスとして判断する。
00326 #  - 先頭文字が'/' (UNIXの場合)
00327 #  - 先頭3文字がアルファベット+'/'+'\\' (Windowsの場合)
00328 #  - 先頭2文字が'\\\\' (Windowsネットワークパスの場合)
00329 #
00330 # @param str 判定対象文字列
00331 #
00332 # @return 絶対パス判定結果
00333 #
00334 # @else
00335 # @brief Investigate whether the given string is absolute path or not
00336 # @endif
00337 def isAbsolutePath(str):
00338   if str[0] == "/":
00339     return True
00340   if str[0].isalpha() and str[1] == ":" and str[2] == "\\":
00341     return True
00342   if str[0] == "\\" and str[1] == "\\":
00343     return True
00344 
00345   return False
00346 
00347 
00348 ##
00349 # @if jp
00350 # @brief 与えられた文字列がURLかどうかを判断する
00351 #
00352 # 与えられた文字列がURL表現かどうかを判断する。
00353 # 与えられた文字列中に、'://'という文字列が含まれている場合には
00354 # URL表現として判断する。
00355 #
00356 # @param str 判定対象文字列
00357 #
00358 # @return URL判定結果
00359 #
00360 # @else
00361 # @brief Investigate whether the given string is URL or not
00362 # @endif
00363 def isURL(str):
00364   pos = 0
00365   if str == "":
00366     return False
00367 
00368   pos = str.find(":")
00369   if pos != 0 and pos != -1 and str[pos+1] == "/" and str[pos+2] == "/":
00370     return True
00371 
00372   return False
00373 
00374 
00375 ##
00376 # @if jp
00377 # @brief 与えられたオブジェクトを文字列に変換
00378 #
00379 # 引数で指定されたオブジェクトを文字列に変換する。
00380 #
00381 # @param n 変換対象オブジェクト
00382 #
00383 # @return 文字列変換結果
00384 #
00385 # @else
00386 # @brief Convert the given object to st::string.
00387 # @endif
00388 def otos(n):
00389   if type(n) == int or type(n) == str or type(n) == long or type(n) == float:
00390     return str(n)
00391 
00392 
00393 
00394 ##
00395 # @if jp
00396 # @brief 与えられた文字列をリストに変換
00397 #
00398 # 引数で指定された文字列を「,」で分割し、リストに変換する。
00399 #
00400 # @param _type 変換結果リスト
00401 # @param _str 変換元文字列
00402 #
00403 # @return リスト変換処理結果
00404 #
00405 # @else
00406 # 
00407 # @endif
00408 def _stringToList(_type, _str):
00409   list_ = split(_str,",")
00410   len_ = len(list_)
00411 
00412   if len(_type[0]) < len(list_):
00413     sub = len(list_) - len(_type[0])
00414     for i in range(sub):
00415       _type[0].append(_type[0][0])
00416   elif len(_type[0]) > len(list_):
00417     sub = len(_type[0]) - len(list_)
00418     for i in range(sub):
00419       del _type[0][-1]
00420 
00421   for i in range(len_):
00422     str_ = [list_[i]]
00423     eraseHeadBlank(str_)
00424     eraseTailBlank(str_)
00425     list_[i] = str_[0]
00426 
00427   for i in range(len(list_)):
00428     if type(_type[0][i]) == int:
00429       _type[0][i] = int(list_[i])
00430     elif type(_type[0][i]) == long:
00431       _type[0][i] = long(list_[i])
00432     elif type(_type[0][i]) == float:
00433       _type[0][i] = float(list_[i])
00434     elif type(_type[0][i]) == str:
00435       _type[0][i] = str(list_[i])
00436     else:
00437       return False
00438 
00439   return True
00440 
00441 
00442 ##
00443 # @if jp
00444 # @brief 与えられた文字列をオブジェクトに変換
00445 #
00446 # 引数で与えられた文字列を指定されたオブジェクトに変換する。
00447 #
00448 # @param _type 変換先オブジェクト
00449 # @param _str 変換元文字列
00450 #
00451 # @return 変換処理実行結果
00452 #
00453 # @else
00454 # @brief Convert the given object to st::string.
00455 # @endif
00456 def stringTo(_type, _str):
00457   if type(_type[0]) == int:
00458     _type[0] = int(_str)
00459     return True
00460   elif type(_type[0]) == long:
00461     _type[0] = long(_str)
00462     return True
00463   elif type(_type[0]) == float:
00464     _type[0] = float(_str)
00465     return True
00466   elif type(_type[0]) == list:
00467     return _stringToList(_type, _str)
00468   elif type(_type[0]) == str:
00469     _type[0] = str(_str)
00470     return True
00471   
00472   return False
00473 
00474 
00475 ##
00476 # @if jp
00477 # @brief 与えられた文字列リストから重複を削除
00478 #
00479 # 引数で与えられた文字列リストから重複を削除したリストを作成する。
00480 #
00481 # @param sv 確認元文字列リスト
00482 #
00483 # @return 重複削除処理結果リスト
00484 #
00485 # @else
00486 #
00487 # @endif
00488 def unique_sv(sv):
00489   return for_each(sv, unique_strvec())._str
00490 
00491 
00492 ##
00493 # @if jp
00494 # @brief 与えられた文字列リストからCSVを生成
00495 #
00496 # 引数で与えられた文字列リストの各要素を並べたCSVを生成する。
00497 # 文字列リストが空の場合には空白文字を返す。
00498 #
00499 # @param sv CSV変換対象文字列リスト
00500 #
00501 # @return CSV変換結果文字列
00502 #
00503 # @else
00504 #
00505 # @endif
00506 def flatten(sv):
00507   if len(sv) == 0:
00508     return ""
00509 
00510   _str = ""
00511   _str = ", ".join(sv)
00512 
00513   return _str
00514 
00515 
00516 ##
00517 # @if jp
00518 # @brief 与えられた文字列リストを引数リストに変換
00519 #
00520 # 引数で与えられた文字列リストの各要素末尾に'\\0'を加え、
00521 # 引数リストに変換する。<br>
00522 # ※本モジュールでは引数をそのまま返す
00523 #
00524 # @param args 変換対象文字列リスト
00525 #
00526 # @return 引数変換結果文字列
00527 #
00528 # @else
00529 #
00530 # @endif
00531 def toArgv(args):
00532   return args

OpenRTMに対してMon Mar 17 15:11:06 2008に生成されました。  doxygen 1.5.4